首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于从ListView中检索视图的困惑

关于从ListView中检索视图的困惑
EN

Stack Overflow用户
提问于 2017-09-28 20:37:14
回答 3查看 45关注 0票数 1

我试图在安卓应用程序中创建一个简单的ListView,并更改视图的背景颜色。

我只需覆盖已定义的ArrayAdapter类的getView()方法并在其中更改它,就成功了。

代码语言:javascript
复制
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
         android.R.layout.simple_list_item_1, Categories) {
  @Override
  public View getView(int pos, View v, ViewGroup vg) {
    View view = super.getView(pos, v, vg);

    switch (pos) {
      case 0:
        view.setBackgroundColor(Color.RED);
        break;
      case 1:
        view.setBackgroundColor(Color.BLUE);
        break;
      default:
        break;
    }

    return view;
  }
};

但是,如果我删除switch-statement并在此函数外部使用它并返回视图,则颜色不会更新。我的意思是这样的:(lv是我的ListView)

代码语言:javascript
复制
lv.setAdapter(arrayAdapter);
for (int i=0; i<2; ++i) {
  View V = (View) lv.getAdapter().getView(i, null, lv);

  switch (i) {
    case 0:
      V.setBackgroundColor(Color.RED);
      break;
    case 1:
      V.setBackgroundColor(Color.BLUE);
      break;
    default:
      break;
  }
}

它确实会返回一个对视图的引用,那么为什么它不是这样工作的呢?

EN

回答 3

Stack Overflow用户

发布于 2017-09-28 20:45:30

无论何时你改变了什么,都可以打电话给:

代码语言:javascript
复制
ArrayAdapter.notifyDataSetChanged();

无论如何,这不是很好的英式方式,但我猜每个解决方案都是一个解决方案¯_(ツ)_/

票数 1
EN

Stack Overflow用户

发布于 2017-09-28 20:48:55

我建议你使用RecyclerView而不是ListView。有一次,我创建了一个彩色列表。在这里,我只是复制我的代码。

代码语言:javascript
复制
public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder>{
    private final ArrayList<String> dataSet;

    class ViewHolder extends RecyclerView.ViewHolder {
        final TextView mTextView;
        final CardView cardView;
        ViewHolder(View v) {
            super(v);
            mTextView = (TextView) v.findViewById(R.id.info_text);
            cardView = (CardView) v.findViewById(R.id.item_container);
        }
    }

    public MyListAdapter(ArrayList<String> myDataset) {
        dataSet = myDataset;
    }

    @Override
    public MyListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(dataSet.get(position));
        switch (position%11){
            case 0: holder.cardView.setCardBackgroundColor(0xFFB71C1C);
                break;
            case 1: holder.cardView.setCardBackgroundColor(0xFF880E4F);
                break;
            case 2: holder.cardView.setCardBackgroundColor(0xFF4A148C);
                break;
            case 3: holder.cardView.setCardBackgroundColor(0xFF311B92);
                break;
            case 4: holder.cardView.setCardBackgroundColor(0xFF1A237E);
                break;
            case 5: holder.cardView.setCardBackgroundColor(0xFF01579B);
                break;
            case 6: holder.cardView.setCardBackgroundColor(0xFF004D40);
                break;
            case 7: holder.cardView.setCardBackgroundColor(0xFF1B5E20);
                break;
            case 8: holder.cardView.setCardBackgroundColor(0xFF33691E);
                break;
            case 9: holder.cardView.setCardBackgroundColor(0xFF827717);
                break;
            case 10: holder.cardView.setCardBackgroundColor(0xFFE65100);
                break;
            default: holder.cardView.setCardBackgroundColor(0xFFBF360C);
        }
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-09-29 10:32:01

您应该使用interface:在YourAdapter.class中定义一个接口:

代码语言:javascript
复制
    public interface OnColorEvent{
     void change(View v,int position)
 }

在YourAdapter.class中设置监听器:

代码语言:javascript
复制
private OnColorEvent e;
public void setOnColorEvent(OnColorEvent e)
{
this.e=e;
}

在您的getView()方法中:

代码语言:javascript
复制
    @Override
      public View getView(int pos, View v, ViewGroup vg) {
        View view = super.getView(pos, v, vg);
    if(null!=e)
    {
    e.change(v,pos);
    }
    }
In YourActivity.class:
listview.setOnColorEvent(new OnColorEvent{
@Overide
public void change(View v,int position)
{
switch (position) {
    case 0:
      V.setBackgroundColor(Color.RED);
      break;
    case 1:
      V.setBackgroundColor(Color.BLUE);
      break;
    default:
      break;
  }
}
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46469367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档