दिलचस्प पोस्ट
सीएसएस: शुद्ध सीएसएस स्क्रॉल एनीमेशन स्विफ्ट में "स्वयं" का क्या इस्तेमाल होता है? सी # मैं कैसे जांच सकता हूँ कि कोई URL मौजूद है / मान्य है? विशिष्ट वस्तु को Rdata फ़ाइल से प्राप्त करें किसी ऑब्जेक्ट को रिक्त बनाम डिस्पोज़ (सेट करना) एक PyQt अनुप्रयोग में IPython Qt कंसोल को एम्बेड करना एक समारोह बुला बैकिक्स स्वचालित HTTPS कनेक्शन / नोड.जेएस / एक्सप्रेस के साथ रीडायरेक्ट एक पीडीएफ के अंदर जावास्क्रिप्ट का उपयोग करना सेलेनियम वेबड्राइवर डिफ़ॉल्ट रूप से किस प्रोफाइल का उपयोग करता है? Websphere 8 में जेएक्स-आरएस जर्सी 2.10 समर्थन एक HTML तत्व की स्थिति (एक्स, वाई) पुनर्प्राप्त करें SQL स्टेटमेंट में एएसपी चर का उपयोग कैसे करें एक जावा एपीआई जावा स्रोत फ़ाइलों को उत्पन्न करने के लिए Asp.NET नियंत्रक: एक एसिंक्रोनस मॉड्यूल या हैंडलर पूरा हो गया जबकि एक अतुल्यकालिक ऑपरेशन अभी भी लंबित था

कस्टम सूची फ़ील्ड क्लिक ईवेंट

im एक आवेदन पत्र जिसमें मैं सूची सूची प्रदर्शित करने के लिए कस्टम सूची क्षेत्र बनाया है। मेरे कस्टमलास्टफ़िल्ड में एक छवि और एक पंक्ति में पाठ है। listfield पंक्ति पर क्लिक करने पर im gettiing फील्ड परिवर्तन श्रोता, लेकिन मैं भी छवि पर फ़ीचर परिवर्तक को रखना चाहता हूँ .. क्या कोई मुझे बता सकता है कि मैं यह कैसे कर सकता हूँ

यहाँ मेरा कोड है

public class CustomListField extends ListField implements ListFieldCallback { private Vector _listData; private int _MAX_ROW_HEIGHT = 60; public CustomListField(Vector data) { _listData = data; setSize(_listData.size()); setSearchable(true); setCallback(this); setRowHeight(_MAX_ROW_HEIGHT); } protected void drawFocus(Graphics graphics, boolean on) { XYRect rect = new XYRect(); graphics.setGlobalAlpha(150); graphics.setColor(Color.BLUE); getFocusRect(rect); drawHighlightRegion(graphics, HIGHLIGHT_FOCUS, true, rect.x, rect.y, rect.width, rect.height); } public int moveFocus(int amount, int status, int time) { this.invalidate(this.getSelectedIndex()); return super.moveFocus(amount, status, time); } public void onFocus(int direction) { super.onFocus(direction); } protected void onUnFocus() { this.invalidate(this.getSelectedIndex()); } public void refresh() { this.getManager().invalidate(); } public void drawListRow(ListField listField, Graphics graphics, int index, int y, int w) { listField.setBackground(BackgroundFactory.createBitmapBackground(Bitmap.getBitmapResource("listing_bg.png"))); ListRander listRander = (ListRander) _listData.elementAt(index); graphics.setGlobalAlpha(255); graphics.setFont(Font.getDefault().getFontFamily().getFont(Font.PLAIN, 24)); final int margin = 5; final Bitmap thumb = listRander.getListThumb(); final String listHeading = listRander.getListTitle(); final Bitmap nevBar = listRander.getNavBar(); // list border graphics.setColor(Color.GRAY); graphics.drawRect(0, y, w, _MAX_ROW_HEIGHT); // thumbnail border & thumbnail image graphics.setColor(Color.BLACK); // graphics.drawRoundRect(margin-2, y+margin-2,thumb.getWidth()+2, thumb.getHeight()+2, 5, 5); graphics.drawBitmap(margin, y + margin, thumb.getWidth(), thumb.getHeight(), thumb, 0, 0); // drawing texts // graphics.setFont(Font.BOLD); graphics.drawText(listHeading, margin + thumb.getWidth(), y + margin); graphics.setColor(Color.GRAY); // graphics.setFont(Font.smallFont); // graphics.drawText(listDesc, 2*margin+thumb.getWidth(), y+ margin+20); // // // graphics.drawText(listDesc2, 2*margin+thumb.getWidth(), y+ margin+32); // draw navigation button final int navBarPosY = y + (_MAX_ROW_HEIGHT / 2 - nevBar.getHeight() / 2); final int navBarPosX = Graphics.getScreenWidth() - nevBar.getWidth() + margin; graphics.drawBitmap(navBarPosX, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0, 0); } public Object get(ListField listField, int index) { String rowString = (String) _listData.elementAt(index); return rowString; } public int indexOfList(ListField listField, String prefix, int start) { for (Enumeration e = _listData.elements(); e.hasMoreElements();) { String rowString = (String) e.nextElement(); if (rowString.startsWith(prefix)) { return _listData.indexOf(rowString); } } return 0; } public int getPreferredWidth(ListField listField) { return 3 * listField.getRowHeight(); } /* protected boolean trackwheelClick(int status, int time) { invalidate(getSelectedIndex()); Dialog.alert(" U have selected :" + getSelectedIndex()); return super.trackwheelClick(status, time); } */ } 

मुझे सूचीफील्ड पंक्ति की स्टार इमेज पर क्लिक करें सूचीकर्ता रखना चाहते हैं I

और निम्नलिखित abbove कोड का उत्पादन है। यहां छवि विवरण दर्ज करें

Solutions Collecting From Web of "कस्टम सूची फ़ील्ड क्लिक ईवेंट"

मैंने पिछले एक परियोजना पर ऐसा कुछ किया था:

पृष्ठभूमि

जैसा कि अर्हिमेड ने अपने जवाब में कहा था , और जैसा कि आप यहां ब्लैकबेरी मंचों पर पढ़ सकते हैं, आप ListField भीतर पूर्ण Field ऑब्जेक्ट नहीं कर सकते। drawListRow() पंक्तियों की सामग्री को सीधे ड्रॉ drawListRow() में टेक्स्ट के रूप में खींचा जाता है, और बिटमैप्स आदि। सामग्री Field उदाहरण नहीं हैं, और इसलिए, ध्यान देने योग्य नहीं हैं।

तो, मैंने जो किया वह ListField को एक उप-वर्ग Manager साथ बदलना था। मूल रूप से, मैंने एक VerticalFieldManager इस्तेमाल किया, लेकिन मुझे उस के साथ समस्याओं में भाग गया मैं स्टैक अतिप्रवाह पर बहुत सारे मुद्दों को देख रहा हूं, जहां लोग वर्टिकलफिल्ड प्रबंधक को उप-वर्ग देते हैं, केवल एक छोटे व्यवहार को कस्टमाइज़ करते हैं, और सब कुछ ब्रेकिंग शुरू होता है मुझे लगता है कि VerticalFieldManager Manager अच्छी तरह से काम करता है यदि आप अपना सामान्य व्यवहार स्वीकार करते हैं, और अगर आपको कुछ और की जरूरत है, तो बस सीधे Manager विस्तार करें खड़ी स्टैक्ड पंक्तियों के लिए लेआउट का प्रदर्शन करना बहुत आसान है।

तब मैंने प्रत्येक पंक्ति को अपना Manager , और पंक्ति के Field वहां स्थान पर रखने के लिए sublayout() में कस्टम लेआउट लागू किया, जहां मैं उन्हें चाहता था फिर मैं पंक्ति को फ़ोकस करने योग्य बना सकता हूं, और फिर पंक्ति पर एक बिटमैप / बटन को अलग-अलग फोकस करने योग्य (जैसे आपका तारा)। पंक्ति पर क्लिक करने से एक कार्रवाई का आह्वान किया जाता है, और स्टार पर क्लिक करने से किसी अन्य को आमंत्रित किया जाता है

मुझे ध्यान दें, हालांकि, मेरे ऐप में, प्रदर्शन कोई समस्या नहीं थी, क्योंकि मेरे पास केवल 10-20 पंक्तियां थीं इसके अलावा, मुझे अपने उदाहरण को मैच करने के लिए अपना कोड संशोधित करना होगा, इसलिए इस कोड को केवल हल्के ढंग से परीक्षण करने पर विचार करें। हालांकि, मैंने इसे एक एप में बनाया था, इसलिए इसे मेरे मान्यताओं तक ठीक करना चाहिए, और आपका विवरण वैध था।

कार्यान्वयन

सबसे पहले, यह मुझे स्पष्ट नहीं था कि आपके ListRander क्या है (आप उस कोड को नहीं दिखाया है)। हालांकि, मेरे कोड में, मुझे एक पंक्ति के बारे में जानकारी रखने के लिए एक डेटा वर्ग की आवश्यकता है I ऐसा लगता है कि आपने कैसे ListRander उपयोग किया ListRander , इसलिए मैंने इसका इस्तेमाल किया है:

 public class ListRander { private String _title; private Bitmap _thumb; public ListRander(String title, Bitmap thumb) { _title = title; _thumb = thumb; } public String getTitle() { return _title; } public Bitmap getThumb() { return _thumb; } } 

उसके बाद, मैंने अपने CustomListField वर्ग को अपने साथ बदल दिया:

 public class CustomListField extends Manager implements FocusChangeListener { private int _MAX_ROW_HEIGHT = 60; private boolean _searchable = false; private Vector _listData; private FieldChangeListener _fieldListener; public CustomListField(Vector data) { super(FOCUSABLE | VERTICAL_SCROLL | VERTICAL_SCROLLBAR); setSearchable(true); setEditable(false); setListData(data); } public void setChangeListener(FieldChangeListener listener) { // we need to save this listener, because we set it to listen to all new rows _fieldListener = listener; int numFields = getFieldCount(); for (int f = 0; f < numFields; f++) { getField(f).setChangeListener(listener); } super.setChangeListener(listener); } public int getRowHeight() { return _MAX_ROW_HEIGHT; } public void setSearchable(boolean searchable) { _searchable = searchable; } public int getSelectedIndex() { return getFieldWithFocusIndex(); // TODO?? } public Object get(int index) { return _listData.elementAt(index); } public int indexOfList(String prefix, int start) { if (start >= _listData.size() || !_searchable) { return -1; } else { int result = getSelectedIndex(); // the default result if we find no matches for (Enumeration e = _listData.elements(); e.hasMoreElements(); ) { String rowString = (String) e.nextElement(); if (rowString.startsWith(prefix)) { return _listData.indexOf(rowString); } } return result; } } protected boolean navigationClick(int status, int time) { CustomListRow focus = (CustomListRow) getFieldWithFocus(); if (focus != null) { // see if the row wants to process this click if (!focus.navigationClick(status, time)) { // let our FieldChangeListener know that this row has been clicked fieldChangeNotify(getFieldWithFocusIndex()); } return true; } else { return false; } } protected void sublayout(int width, int height) { int w = Math.min(width, getPreferredWidth()); int h = Math.min(height, getPreferredHeight()); int rowHeight = getRowHeight(); int numRows = getFieldCount(); setExtent(w, h); setVirtualExtent(w, rowHeight * numRows); for (int i = 0; i < numRows; i++) { Field f = getField(i); setPositionChild(f, 0, rowHeight * i); layoutChild(f, w, rowHeight); } } public int getPreferredWidth() { return Display.getWidth(); } public int getPreferredHeight() { return Display.getHeight(); } public void setListData(Vector listData) { _listData = listData; if (listData != null) { int listSize = listData.size(); int numRows = getFieldCount(); for (int s = 0; s < listSize; s++) { if (s < numRows) { // we can reuse existing CustomListRows CustomListRow row = (CustomListRow) getField(s); row.setData((ListRander) listData.elementAt(s)); } else { CustomListRow row = new CustomListRow((ListRander) listData.elementAt(s)); row.setChangeListener(_fieldListener); row.setFocusListener(this); add(row); } } if (listSize < numRows) { // delete the excess rows deleteRange(listSize, numRows - listSize); } } else { deleteAll(); } invalidate(); } public void focusChanged(Field field, int eventType) { // we handle scrolling here, when focus changes between rows if (eventType == FOCUS_GAINED) { if (field.getTop() < getVerticalScroll()) { // field is off the top of the screen, so scroll up setVerticalScroll(field.getTop()); } else if (field.getTop() >= getVerticalScroll() + getVisibleHeight()) { // field is off the bottom of the screen, so scroll down setVerticalScroll(field.getTop() - getVisibleHeight() + getRowHeight()); } } } } 

अंत में, एक पंक्ति का प्रतिनिधित्व मेरी CustomListRow वर्ग द्वारा किया जाता है:

 public class CustomListRow extends Manager implements FieldChangeListener { private static final int _MAX_ROW_HEIGHT = 60; private ListRander _data; private BitmapField _thumb; private LabelField _title; private FocusableBitmapField _star; private static final Bitmap _starImg = Bitmap.getBitmapResource("star.png"); private static final Bitmap _bgImg = Bitmap.getBitmapResource("listing_bg.png"); private SeparatorField _separator; private int _fontColor = Color.BLACK; private boolean _highlighted = false; private int _width; // subclass exists to expose focus methods (make public) private class FocusableBitmapField extends BitmapField { public FocusableBitmapField() { super(_starImg, BitmapField.FOCUSABLE | BitmapField.EDITABLE); } public void onFocus(int direction) { super.onFocus(direction); } public void onUnfocus() { super.onUnfocus(); } } public CustomListRow(ListRander data) { super(Field.FOCUSABLE | Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR); setBackground(BackgroundFactory.createBitmapBackground(_bgImg)); _width = Display.getWidth(); long labelStyle = (DrawStyle.LEFT | DrawStyle.TOP | DrawStyle.ELLIPSIS); _title = new LabelField("", labelStyle) { // custom anonymous class to change font color protected void paint(Graphics g) { int c = g.getColor(); g.setColor(_fontColor); super.paint(g); g.setColor(c); } }; _title.setFont(Font.getDefault().getFontFamily().getFont(Font.PLAIN, 24)); _thumb = new BitmapField(); _star = new FocusableBitmapField(); _star.setChangeListener(this); _separator = new SeparatorField() { // custom anonymous class to change separator color protected void paint(Graphics g) { int c = g.getColor(); g.setColor(Color.GRAY); super.paint(g); g.setColor(c); } }; setData(data); add(_thumb); add(_title); add(_star); add(_separator); } public ListRander getData() { return _data; } public void setData(ListRander value) { if (value != _data) { _data = value; _title.setText(value.getTitle()); _thumb.setBitmap(value.getThumb()); } } private void onStarClicked() { Dialog.alert("Star has been clicked or tapped!"); } private void onRowClicked() { Dialog.alert("Row has been clicked or tapped!"); } public void fieldChanged(Field field, int context) { if (field == _star) { onStarClicked(); } } public boolean navigationClick(int status, int time) { if (_star.isFocus()) { onStarClicked(); return true; } /* else { onRowClicked(); return true; } */ return false; // we will not consume this event } protected void highlight(boolean onRow) { _fontColor = onRow ? Color.WHITE : Color.BLACK; // change font color for contrast _highlighted = onRow; invalidate(); } protected void onFocus(int direction) { // called when focus first transfers to this row, from another Field if (direction == 1) { // coming from top to bottom, we highlight the row first, not the star highlight(true); } else if (direction == -1) { // coming from bottom to top, we highlight the star button first, not the row _star.onFocus(direction); highlight(false); } } protected void onUnfocus() { // remove highlighting of the row, if any highlight(false); super.onUnfocus(); } protected int moveFocus(int amount, int status, int time) { // called when this row already has focus (either on row, or star button) if (amount > 0) { // moving top to bottom if (!_star.isFocus()) { // we were on the row, now move to the star button _star.onFocus(1); highlight(false); amount--; // consume one unit of movement } } else { // moving from bottom to top if (_star.isFocus()) { // we were on the star button, now move back over to the row _star.onUnfocus(); highlight(true); amount++; // consume one unit of movement } } return amount; } protected boolean touchEvent(net.rim.device.api.ui.TouchEvent event) { // We take action when the user completes a click (aka unclick) int eventCode = event.getEvent(); if ((eventCode == TouchEvent.UNCLICK) || (eventCode == TouchEvent.DOWN)) { // Get the touch location, within this Manager int x = event.getX(1); int y = event.getY(1); if ((x >= 0) && (y >= 0) && (x < _width) && (y < _MAX_ROW_HEIGHT)) { int field = getFieldAtLocation(x, y); if ((field >= 0) && (getField(field) == _star)) { // Let event propagate to (star) button field return super.touchEvent(event); } else { if (eventCode == TouchEvent.UNCLICK) { // A completed click anywhere else in this row should popup details for this selection fieldChangeNotify(1); onRowClicked(); } else { // This is just a soft touch (TouchEvent.DOWN), without full click setFocus(); } // Consume the event return true; } } } // Event wasn't for us, let superclass handle in default manner return super.touchEvent(event); } protected void sublayout(int width, int height) { height = Math.min(getPreferredHeight(), height); setExtent(_width, height); final int margin = 5; int thumbWidth = _thumb.getPreferredWidth(); layoutChild(_thumb, thumbWidth, _thumb.getPreferredHeight()); setPositionChild(_thumb, margin, margin); int starWidth = _star.getPreferredWidth(); int starHeight = _star.getPreferredHeight(); layoutChild(_star, starWidth, starHeight); setPositionChild(_star, width - starWidth - margin, (height - starHeight) / 2); // this assumes you want margin between all fields, and edges layoutChild(_title, width - thumbWidth - starWidth - 4 * margin, _title.getPreferredHeight()); setPositionChild(_title, margin + thumbWidth /* + margin */, margin); // TODO? } protected void paintBackground(Graphics g) { super.paintBackground(g); if (_highlighted) { // you can't override drawFocus() for a Manager, so we'll handle that here: int oldColor = g.getColor(); int oldAlpha = g.getGlobalAlpha(); XYRect rect = new XYRect(); g.setGlobalAlpha(150); g.setColor(Color.BLUE); getFocusRect(rect); drawHighlightRegion(g, HIGHLIGHT_FOCUS, true, rect.x, rect.y, rect.width, rect.height); g.setGlobalAlpha(oldAlpha); g.setColor(oldColor); } } public int getPreferredWidth() { return _width; } public int getPreferredHeight() { return _MAX_ROW_HEIGHT; } } 

प्रयोग

इस तरह आप पूरी सूची क्षेत्र (शायद एक Screen श्रेणी में) का उपयोग कर सकते हैं:

 public class ListScreen extends MainScreen implements FieldChangeListener { public ListScreen() { try { Vector data = new Vector(); Bitmap icon = Bitmap.getBitmapResource("list_icon.png"); for (int i = 0; i < 15; i++) { ListRander lr = new ListRander("Product Name " + i, icon); data.addElement(lr); } CustomListField list = new CustomListField(data); add(list); list.setChangeListener(this); } catch (Exception e) { e.printStackTrace(); } } public void fieldChanged(Field field, int context) { if (field instanceof CustomListRow) { CustomListRow row = (CustomListRow) field; Dialog.alert(row.getData().getTitle() + " was selected!"); } } } 

मेरे ऐप में, CustomListRow खुद ही आपके स्टार क्लिक के समतुल्य को संभालने के लिए इसे समझने लगा। हालांकि, मेरे लिए, यह समझ में नहीं आया कि पंक्ति को उस तरीके से संभाला है। इसलिए, मैं आपको FieldChangeListener पर CustomListField FieldChangeListener सेट करने देता FieldChangeListener , जिसे किसी भी पंक्ति का चयन करते समय वापस बुलाया जाता है मेरी स्क्रीन कक्षा में उपरोक्त उदाहरण देखें। यदि आप पंक्ति को संभाल करना चाहते हैं, तो CustomListRow वर्ग के अंदर भी क्लिक करें, यह ठीक है। मैंने वहाँ एक onRowClicked() विधि रखी उस कोड के लिए खोजें जहां उस पर टिप्पणी की गई है, और आप पुनः सक्रिय कर सकते हैं, उस पद्धति को लागू कर सकते हैं ( onRowClicked() )।

मुद्दे

  • मेरे ऐप को सूची खोज की आवश्यकता नहीं थी मैंने उस का एक नमूना कार्यान्वयन रखा, जैसे ListField है लेकिन, मैंने इसका परीक्षण नहीं किया। यह तुम्हारा काम है, अगर आपको इसकी ज़रूरत है मैंने आपको indexOfList() कार्यान्वयन के साथ शुरू किया था (देखें indexOfList() )।
  • मुझे नहीं पता था कि आपके "एनएवी बार" क्या था एक बार आमतौर पर एक पूर्ण-चौड़ाई वाला आइटम होता है, जैसे कि स्टेटस बार या टूलबार। मैं आपके स्क्रीनशॉट में ऐसा कुछ नहीं देखता हूं। जानकारी लाने के लिए, प्रत्येक पंक्ति के दाईं ओर एक एनएवी आइटम थोड़ी तीर हो सकता है। लेकिन, मुझे नहीं पता था कि आपके स्क्रीनशॉट में भी इसलिए, मैंने उस कोड को नजरअंदाज किया यदि आपको एक एनएवी बार की आवश्यकता है, तो आप स्पष्ट रूप से जानते हैं कि यह क्या होना चाहिए, और यह मेरे कोड में ऊपर जोड़ सकते हैं।
  • मैं यह नहीं बता सकता था कि आपने स्टार की पृष्ठभूमि छवि के हिस्से के रूप में स्टार को जोड़ा है या नहीं, या यदि आपके पास उस के लिए एक अलग छवि थी मैंने स्टार का प्रतिनिधित्व करने के लिए एक अलग स्टार पेज जोड़ा। मुझे लगता होगा कि स्टार को क्लिक करने से इसे भरता है, या इसे डाला जाता है, या कुछ लेकिन, आपने उस समस्या का वर्णन नहीं किया, इसलिए मुझे लगता है कि आप इसे संभाल सकते हैं यदि आपको स्टार का प्रतिनिधित्व करने के लिए एक कस्टम फ़ील्ड की आवश्यकता है, जो कि चुने गए और अनसेक्टेड छवियां हो सकती है, तो उसे एक नया प्रश्न के रूप में पोस्ट करें
  • आपके पास कुछ कोड था जो दिखाई दे रहा था जैसे वह पंक्ति चौड़ाई को 3x पंक्ति ऊँचाई सेट करने का प्रयास कर रही थी, लेकिन वह आपकी स्क्रीन शॉट से मेल नहीं खाती थी। अधिकांश सूचियां पूर्ण स्क्रीन चौड़ाई हैं इसलिए, मैं उस कोड को हटाता हूं मेरी getPreferredWidth() लागू होते getPreferredWidth() और पूर्ण स्क्रीन चौड़ाई का अनुरोध करता है अगर आप चाहें तो बदलें

एंड्रॉइड की ListView के विपरीत, बीबी की ListField सूची आइटमों के अंदर ध्यान देने योग्य / क्लिक करने योग्य फ़ील्ड के लिए तैयार नहीं है। तो इसका समाधान करने के किसी भी प्रयास में कुछ नकारात्मक दुष्प्रभाव होंगे।

एक अपेक्षाकृत आसान / त्वरित समाधान वर्टिकलफिल्ड प्रबंधक पर स्विच करना होगा ( यह अन्य स्टैक अतिप्रवाह प्रश्न देखें )। लेकिन अगर सूची बहुत लंबी है (कई सैकड़ों से अधिक, मेरा मानना ​​है) आप बहुत ज्यादा "खाने" का जोखिम लेते हैं

यदि ऐप केवल टच स्क्रीन के लिए डिज़ाइन किया गया है, तो आप ListField साथ रहने की कोशिश कर सकते हैं + स्पर्श इवेंट निर्देशांक के कुछ मैनुअल ट्रैकिंग कर सकते हैं। इसलिए जब आप एक सूची फ़ील्ड क्लिक का पता लगाते हैं (एक तरह से आप आमतौर पर ऐसा करेंगे) तो आप जांच सकते हैं कि स्पर्श निर्देशांक स्टार छवि क्षेत्र से संबंधित है (कम से कम एक्स अक्ष पर)। मैं एक कार्यान्वयन / आविष्कार नहीं करने जा रहा हूँ, लेकिन सिर्फ एक विचार दे रहा हूं।