6

I want to make a view where I can select multiple items from listview and also side by side am changing the color of selected list item and saving that item into my arraylist..My list is shown as below as:

enter image description here

But when I used to scroll it.. It is showing me 1 more item selected, even I am not selecting it like:

enter image description here

But I want that only that list item color should change where I will click...

I am using the code as:

     private class ItemsAdapter extends ArrayAdapter<String> {
 List<String> items;
  Context context;
  private LayoutInflater inflater;
  public ItemsAdapter(Context context, List<String> part_array_list) {
     super( context, R.layout.part_list, R.id.label,part_array_list );

     inflater = LayoutInflater.from(context) ;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
      TextView textView ; 
    String item = (String) this.getItem( position ); 

      if ( convertView == null ) {
        convertView = inflater.inflate(R.layout.part_list, null);

        // Find the child views.
        textView = (TextView) convertView.findViewById( R.id.label );


        // Optimization: Tag the row with it's child views, so we don't have to 
        // call findViewById() later when we reuse the row.
        convertView.setTag( new ListViewHolder(textView) );


      }
      // Reuse existing row view
      else {
        // Because we use a ViewHolder, we avoid having to call findViewById().
        ListViewHolder viewHolder = (ListViewHolder) convertView.getTag();

        textView = viewHolder.getTextView() ;

      }


      textView.setText( part_array_list.get(position) );      

      return convertView;


      }
      }
        /** Holds child views for one row. */
           private class ListViewHolder {

 private TextView textView ;
 public ListViewHolder() {}
 public ListViewHolder( TextView textView ) {

   this.textView = textView ;
 }

 public TextView getTextView() {
   return textView;
 }
 public void setTextView(TextView textView) {
   this.textView = textView;
 }    

}

and in OnCreate() method,

         final ArrayAdapter<String> part_list_adapter=new ItemsAdapter(AssetSearch.this, part_array_list);
        //PartNumber_List.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    PartNumber_List.setAdapter(part_list_adapter);

    PartNumber_List.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position,
            long id) {
         ListViewHolder viewHolder = (ListViewHolder) v.getTag();
         viewHolder.getTextView().setBackgroundColor(R.color.result_image_border);

        String item=(String) part_list_adapter.getItem((int) id);
        });
4

7 に答える 7

10

ここでの問題は、背景色をビューに設定していて、スクロールすると、 を使用したためにそのビューを再利用してしまうことですconvertView。これはまさにあなたがやるべきことです。

しかしもちろん、それはリスト項目が選択されるべきではないときに選択されることを意味します。これを修正するには、getView()メソッドで背景色をデフォルト値にリセットする必要があります。元の色はわかりませんが、透明だったと思います。したがって、次のようになります。

textView.setBackgroundColor(android.R.color.transparent);

したがって、背景色をデフォルトに設定していますが、選択した項目から離れてスクロールすると、選択した背景の代わりに透明な背景が表示されます。これを解決するには、アダプタ クラス内にArrayListof値を配置します。IntegerアイテムがクリックされonItemClick()てトリガーされると、アイテムの位置をそれに追加しますArrayList。たとえば、次のようにします。

public ArrayList<Integer> selectedIds = new ArrayList<Integer>();

アダプタークラスで。次に、onItemClickメソッドは次のようになります。

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

     ArrayList<Integer> selectedIds = ((ItemsAdapter) parent).selectedIds;
     Integer pos = new Integer(position);
     if(selectedIds.contains(pos) {
         selectedIds.remove(pos);
     }
     else {
         selectedIds.add(pos);
     }

     parent.notifyDataChanged();
}

したがって、最後に、getView()メソッドに次の行を追加します。

textView.setBackground(selectedIds.contains(position) ? R.color.result_image_border : androi.R.color.transparent);  
于 2012-04-11T05:47:35.513 に答える
3

私もこの問題に遭遇しましたが、ビューのリサイクルが原因であることがわかりました。正しい設定を覚えていれば、これによりリサイクルが削除され、問題が修正されますが、ここでは最適なオプションではありません。

@Override
public int getItemViewType(int position) {
    return IGNORE_ITEM_VIEW_TYPE;
}
于 2012-04-11T05:39:58.203 に答える
1

アクティビティの listView で選択されたアイテムを追跡します。アダプターの getView で、位置がリストビューで選択された位置と等しいかどうかを確認し、そこにあるビューの setBackgroundColor を確認します。これは機能します。

于 2012-04-11T05:36:37.833 に答える
1

対応するビューホルダーの背景を設定する必要がないように、itemClickリスナーでConvertViewを使用して何をしようとしても、他のクラスに反映されます。私にとってはうまくいくサンプルをいくつか示します。

public View getView(final int position, View convertView, ViewGroup parent) {
         System.gc();
         final ViewHolder holder;

         if (convertView == null) {
             convertView = mInflater.inflate(R.layout.albumlist, null);
             holder = new ViewHolder();
             holder.albumName = (TextView) convertView.findViewById(R.id.albumDetails);

             convertView.setTag(holder);
         }
         else {
             holder = (ViewHolder) convertView.getTag();
         }


         holder.albumName.setText(albumData[position][0]);

         holder.albumName.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 holder.albumName.setBackgroundColor(R.color.black);


             }});

         return convertView;
 }

     class ViewHolder {

         TextView albumName;


     }

サンプル o/p ここに画像の説明を入力

于 2012-04-11T07:53:07.767 に答える
0

@JasonRobinson の回答に関する訂正:

if(selectedIds.contains(pos) {
         selectedIds.remove(pos); -> **selectedIds.remove(selectedIds.indexOf(pos));**
     }
     else {
         selectedIds.add(pos);
     }
于 2013-03-25T14:41:20.970 に答える
0

リストから任意のリスト項目をクリックしたときにフラグを設定し、このフラグをチェックして、アダプターの getView() メソッドで項目がクリックされたかどうかを判断する必要があります。

于 2012-04-11T05:44:37.797 に答える
0

Jason Robinsonのソリューション (アイデア)は良いですが、エラーがあります! 値によって ArrayList からアイテムを削除することはできません!!!
メソッド ArrayList.remove(int) は項目のインデックスをパラメーターとして取ります!
を使用したい場合は、削除したいアイテムのインデックスを見つける必要があります。例えば:ArrayList<Integer>

private int getIndex(int value) {
    int index = -1;

    for(int i=0; i<selectedIds.size(); i++) {
        if(selectedIds.get(i)==value) {
            index = i;
            break;
        }
    }

    return index;
}

またはメソッドArrayList.indexOf(Object)を使用してインデックスを取得します。

次に、FragmenList または ListActivity からアダプターへの参照を取得する方法について説明します。クラス変数を使用するだけです:

public class SimpleFragment extends ListFragment {
    private MyCustomAdapter mAdapter;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = new MyCustomAdapter(getActivity(), R.layout.row_layout);
        setListAdapter(mAdapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // now you have an access to your adapter through class variable mAdapter
    }
}
于 2013-07-17T13:02:37.763 に答える