2010-12-27 26 views
14

मेरे पास निम्न xml द्वारा परिभाषित एक सूचीदृश्य है। जब उपयोगकर्ता किसी भी पंक्ति पर क्लिक करता है तो मुझे को रनटाइम के दौरान सूची में छवि टॉगल करने की आवश्यकता है। इसे कैसे प्राप्त किया जा सकता है? किसी भी सहायताको बहुत सराहा जाएगा। धन्यवादएंड्रॉइड: सूची दृश्य में छवियों को गतिशील रूप से बदलें

//list_item.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/play" 
android:id="@+id/img" 
/> 
<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:id="@+id/txt" 
/> 
</LinearLayout> 

उत्तर

18

आप दूसरा पैरामीटर पर findViewById बुला (जो क्लिक किया आइटम के View है) onItemClick हैंडलर के भीतर से आइटम की img दृश्य का पता लगाने कर सकते हैं:

public void onItemClick(AdapterView parentView, View clickedItemView, int pos, long id) 
{ 
    ImageView imageView = (ImageView) clickedItemView.findViewById(R.id.img); 
    // ... 
} 

संपादित करें: ध्यान रखें कि एंड्रॉयड सूची पुनः उपयोग कर लेता आइटम View ऑब्जेक्ट्स (जिसे व्यू रीसाइक्लिंग भी कहा जाता है), इसलिए प्रत्येक आइटम की टॉगल स्थिति को बाद में उपयोग के लिए संग्रहीत करने की आवश्यकता है। जब भी कोई सूची आइटम दृश्य डिस्प्ले के लिए सूची आइटम से जुड़ा होता है, तो प्रत्येक आइटम की टॉगल स्थिति को एक्सेस करने की आवश्यकता होती है।

import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 

public class SO4539968TestCaseActivity extends Activity { 
    private static final List<String> ITEM_TEXTS = Arrays.asList(new String[] {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"}); 

    private boolean[] itemToggled; 

    private class MyArrayAdapter<T> extends ArrayAdapter<T> 
    { 
     public MyArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) { 
      super(context, resource, textViewResourceId, objects); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View itemView = super.getView(position, convertView, parent); 
      ImageView imageView = (ImageView) itemView.findViewById(R.id.img); 
      imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 
      return itemView; 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     itemToggled = new boolean[ITEM_TEXTS.size()]; 
     Arrays.fill(itemToggled, false); 

     ListView listView = (ListView) findViewById(R.id.list_view0); 
     listView.setAdapter(new MyArrayAdapter<String>(this, R.layout.list_item, R.id.txt, ITEM_TEXTS)); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> listView, View itemView, int position, long id) { 
       itemToggled[position] = ! itemToggled[position]; 

       ImageView imageView = (ImageView) itemView.findViewById(R.id.img); 
       imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 
      } 
     }); 
    } 
} 

अध्ययन करने के लिए महत्वपूर्ण भागों onItemClick कॉलबैक और MyArrayAdapter में getView की ओवरराइड हैं:

उदाहरण के लिए, यहाँ एक गतिविधि है कि क्लिक पर प्रत्येक आइटम की छवि को टॉगल करता है के उदाहरण काम कर रहा है।

getViewAdapter वर्ग की विधि आइटम लेआउट को बढ़ाने के लिए ज़िम्मेदार है। इस उदाहरण में, मैं सुपर क्लास शुरू में आइटम दृश्य तैयार करने के लिए की getView विधि कॉल, लेकिन फिर मैं उचित रूप से आइटम की img देखने के संसाधन आईडी तैयार करना न भूलें:

imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 

भी देखें: Developing Applications for Android – Gotchas and Quirks

+0

आपको बहुत बहुत धन्यवाद। यह मेरे लिए काम किया। मैं इस समाधान को एक महीने के बारे में बहुत लंबे समय तक खोज रहा था। आपने मुझे बचाया: डी – Vivek

+0

अब, मैं छविदृश्य के स्रोत को बदलने में सक्षम हूं, लेकिन जब मैं नीचे स्क्रॉल करता हूं और फिर वापस आ जाता हूं, तो छविदृश्य वापस अपने पिछले स्रोत पर रीसेट कर दिया जाता है। ये क्यों हो रहा है? क्या आप मेरी मदद कर सकते हैं? – Vivek

+1

@ विवेक: यह एक दृश्य पुन: उपयोग की समस्या की तरह लगता है। कृपया मेरा अद्यतन उत्तर देखें क्योंकि मैंने एक कामकाजी उदाहरण जोड़ा है और एक उत्कृष्ट ब्लॉग पोस्ट से लिंक किया है जो एंड्रॉइड के विचारों के रीसाइक्लिंग का वर्णन करता है। –

-1

उपयोग imageView वर्ग के

public void setImageResource (int resId); 

विधि।

पीएस मेरे पिछले जवाब अधूरा लगता है, यहाँ पूरे समाधान है:

ImageView imageView = (ImageView) this.findViewById(R.id.img); 
       ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 
       imageView.setImageResource(R.drawable.new_image); 
       imageView.invalidate(); 
+0

करने में मदद मिलेगी एक अच्छी तरह से वर्णित पूरा डेमो कोड है। मैं ListView से संबंधित ImageView कैसे प्राप्त करूं? जब मैं ** ImageView iv = (ImageView) दृश्य करता हूं; ** OnListItem में मेटोड क्लिक करें मुझे क्लास कास्ट अपवाद मिलता है। – Vivek

+0

क्या यह काम करता है - ImageView imageView = (ImageView) this.findViewById (R.id.img); – fiction

+1

नहीं, क्योंकि मान लीजिए कि मेरे पास मेरी सूचीदृश्य में 40 पंक्तियां हैं, तो सभी छवियों में एक ही आईडी (यानी img) होगी। तो हम अद्वितीय आईडी के साथ चयनित छवि दृश्य का संभाल नहीं प्राप्त कर सकते हैं। – Vivek

1

मैं गतिशील सूचीदृश्य उत्पन्न होगा और उसके बाद क्रम setimageresource करने के लिए, onclickitem घटना के लिए बाध्य के रूप में 'Kiril Kirilov' से कहते हैं।

12
listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      ImageView imageView=arg1.findViewById(R.id.img); 
      imageView.setImageResource(R.drawable.new_image); 

     } 

    }); 
+0

ओह .. मुझे देर हो चुकी है –

+0

कोई फर्क नहीं पड़ता। मैं आपके प्रयास की सराहना करता हूँ। – Vivek

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। आपके समाधान ने वास्तव में मेरी मदद की। – Vivek

0

यह इतना आसानी से किया जा सकता है, आपको केवल उपयोगकर्ता द्वारा क्लिक की गई सूची आइटम की स्थिति को देखने की आवश्यकता है। के रूप में below_

public class ChangeImageInListDynamically extends Activity { 
/** 
* Adapter for your data. 
*/ 
ImageAdapter adpAR; 
ArrayList<String> itemList; 
ListView mListView; 
ImageAdapter mAdapter; 

/** 
* Indicate which item is currently selected. 
* Its default selected item is '0' e.g., 1st item. 
*/ 
private int selectedPosition=0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    itemList = new ArrayList<String>(); 
    for (int i = 0; i < 11; i++) { 
     itemList.add("Item - "+i); 
    } 

    mListView = (ListView)findViewById(R.id.data_list); 

    //Initialize your adapter 
    mAdapter = new ImageAdapter(nChangeImageInListDynamically.this, itemList); 

    //set adapter to your list. 
    mListView.setAdapter(mAdapter); 

    //set list click listener. 
    mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> av, View view, int position, long id) { 
      //your image that need to change dynamically. 
      ImageView imageView = (ImageView) view.findViewById(R.id.select); 

      //position of clicked item. 
      selectedPosition=position; 

      //change image of respective image. 
      imageView.setImageResource(R.drawable.selected); 

      //notify your adapter to update your list. 
      adpAR.notifyDataSetChanged(); 
     } 
    }); 

} 

static class ViewHolder { 
    TextView title; 
    ImageView img;     
} 

/** 
* Your ImageAdapter. 
*/ 
public class ImageAdapter extends BaseAdapter { 

    ArrayList<String> dataList; 
    Context context; 

    public ImageAdapter(Context context, ArrayList<String> arrayList) { 
     this.context = context; 
     this.dataList = arrayList; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return dataList.size();; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     final ViewHolder holder; 
     Log.d("posiiton ImageAdapater : ",""+position); 
     if (row == null) { 
      LayoutInflater inflater = ChangeImageInListDynamically.this.getLayoutInflater(); 
      row = inflater.inflate(R.layout.listrow, null); 

      holder = new ViewHolder(); 
      holder.title = (TextView) row.findViewById(R.id.text); 
      holder.img = (ImageView) row.findViewById(R.id.select); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     //set titel text. 
     holder.title.setText(dataList.get(position)); 

     //Change Image of selected item dynamically. 
      if(selectedPosition == position) { 
       //Item is selected. 
       holder.img.setImageResource(R.drawable.selected); 

      }else{ 
       //Other non-selected items. 
       holder.img.setImageResource(R.drawable.dis_selected); 

      } 

     return row; 

    } 

} 

} 

मुझे आशा है कि यह यहाँ समस्या imageView हो रही है सब :)

संबंधित मुद्दे