2012-04-11 46 views
5

我想制作一个视图,我可以从列表视图中选择多个项目,也可以并排更改选定列表项目的颜色并将该项目保存到我的数组列表中。 。我的清单如下所示为:从列表视图中选择多个项目并仅更改所选项目的颜色

enter image description here

但是,当我用滚动它..这是显示我1个项目选择,即使我不选择它喜欢:

enter image description here

但我想只有那些列表项的颜色应该改变,我会点击...

我使用的代码:

 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; 
}  

}

在onCreate()方法,

  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); 
     }); 
+0

这是因为在滚动列表时,Android列表会被回收。 – Sujit 2012-04-11 05:42:33

回答

9

这里的问题是,您将背景色设置为视图,然后当您滚动时,由于使用convertView,您最终重新使用该视图。这正是你应该做的,在那里做得很好。

但是,当然,这意味着列表项不应该被选中。为了解决这个问题,您的getView()方法需要将背景颜色重置为默认值。我不知道最初的颜色是什么,但我认为它是透明的。所以,你会放:

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

所以,现在你设置背景色为默认值,但如果你从滚动选定项目走,然后再返回到它,它就会有一个透明的背景,而不是选择背景。要解决此问题,请将IntegerArrayList值放入适配器类中。点击某个项目并触发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); 
+0

嘿非常感谢你的anwer但是当我添加公共ArrayList selectedIds = new ArrayList ();在我的适配器类中,然后在onlistItemClick,它没有采取((ItemsAdapter)父).selectedIds;它给我一个错误,并且不提取selectedIds变量从适配器类:(请帮助做什么 – Kanika 2012-04-11 06:06:33

+0

您需要适配器中的'ArrayList',然后从活动中的'onItemClick'方法访问它。您可以选择任何您想要执行此操作的方法,不得不是我写的,我建议使用getter方法。 – 2012-04-11 06:13:11

+0

嘿请你解决这个问题oblem ..不能够..AM没有得到如何arraylist应该沟通之间的OnItemClick方法和arrayaspater ??如果我在适配器类中创建了一个arraylist,那么我无法在OnItemClick方法中获取它?请帮助:( – Kanika 2012-04-11 06:31:55

1

跟踪活动中listView中选定的项目。在适配器的getView中,检查位置是否等于listview中的所选位置,并检查那里的视图的setBackgroundColor。这将工作。

3

我也遇到过这个问题,发现它是因为回收视图。如果我记得正确的设置,这会消除回收并修复问题,但这不是最好的选择。

@Override 
public int getItemViewType(int position) { 
    return IGNORE_ITEM_VIEW_TYPE; 
} 
+0

没有它没有工作...在哪里把这个方法? – Kanika 2012-04-11 06:11:53

+0

您为该适配器类重写此方法。 – Niko 2012-04-11 06:43:01

+0

没有它的不工作.. – Kanika 2012-04-11 06:50:44

0

你必须设置标志,当您单击列表中的任何列表项,并检查该标志,以确定您getView()适配器的方法天气该项目已被按下。

+0

请帮助如何实现这..我从这个问题停留在昨天,并没有得到任何解决方案呢:( – Kanika 2012-04-11 06:08:52

1

无论你尝试用ConvertView做在itemClick在监听它将反映在其他一些类,为了避免你需要为相应的查看持有人设置背景,我展示了一些适合我的样品,

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 enter image description here

0

有关@JasonRobinson给出的答案的修正:从贾森·罗宾逊

if(selectedIds.contains(pos) { 
     selectedIds.remove(pos); -> **selectedIds.remove(selectedIds.indexOf(pos));** 
    } 
    else { 
     selectedIds.add(pos); 
    } 
0

解决方案(想法)是好的,但有一个错误!你不能从ArrayList中删除它的值!
方法ArrayList.remove(int)将item的索引作为参数!
如果要使用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 
    } 
} 
+0

您提到的第一个问题的另一个解决方案是使用HashSet而不是ArrayList。 HashSet.remove()接受有问题的对象而不是索引:http://developer.android.com/reference/java/util/HashSet.html#remove(java.lang.Object) – Jabari 2014-08-15 04:56:22

相关问题