ListView子对象可点击的confilct

 sunqingfen5863 发布于 2023-02-10 10:47

在提出问题并花了15天时间来解决这个问题后,我再次寻求帮助和解决方案.在MainActivity中,我创建了Json下载任务,它从http下载数据,并使用CustomListAdapter.class填充listview.一切正常.现在,在listview中我有2个textview,我想要点击,其中一个是"Accept",textview只是在xml中,它没有填充Adapter或Json."接受"应该像这样工作"将文本更改为已接受并更改颜色",其工作方式与其他所有内容相同.但是当我点击列表视图中的第一个"接受"(位置0)时,它会更改其他列表视图项目(位置4,9).这就像我点击了位置4,9上的文本视图.在第一张图片上点击"接受"之前,第二张图片是点击之后.

点击之前 /// 点击后

 public class MainActivity extends Activity {

protected static final String TAG = null;
public ArrayList feedList;
public ListView feedListView;
private ProgressBar progressbar;
 private CustomListAdapter adap;
 private LayoutInflater mInflater;


@Override 
public void onCreate(Bundle savedInstanceState)
{
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main); 
      feedListView= (ListView) findViewById(R.id.custom_list);

      mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
      String url = "...";
      new DownloadFilesTask().execute(url);

      getActionBar().setIcon(R.drawable.angel);
      progressbar = (ProgressBar)findViewById(R.id.progressBar);


       public void updateList() {
    adap = new CustomListAdapter(this, feedList);

           feedListView.setAdapter(adap);

            }


      public class DownloadFilesTask extends AsyncTask {


      ///....  

CustomListAdapter.class

    public class CustomListAdapter extends BaseAdapter  
 {

private ArrayList listData;
private LayoutInflater layoutInflater;
private Context mContext;
private ArrayList data;
protected ListView feedListView;
ArrayList> list;

public CustomListAdapter(Context context, ArrayList listData)
{
    this.listData = listData;
    layoutInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mContext = context;
    data = new ArrayList();
    for (int i = 0; i < 10; i++) {
        data.add("Sample Text " + String.valueOf(i));
    }
}


@Override
public int getCount()
{
    return listData.size();
}

@Override
public Object getItem(int position)
{
    return listData.get(position);
}

@Override
public long getItemId(int position)
{
    return position;
}


public View getView( int position, View convertView, ViewGroup parent)
{
 final ViewHolder holder;
 View row=convertView;
    if ((row == null) || (row.getTag()==null)) {

     convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
     holder = new ViewHolder();
     holder.headlineView = (TextView)convertView.findViewById(R.id.name);
     holder.reportedDateView = (TextView) convertView.findViewById(R.id.confid);
     holder.accept= (TextView) convertView.findViewById(R.id.acceptTV);

     convertView.setTag(holder);



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

    }

   final FeedItem newsItem = (FeedItem) listData.get(position);
    holder.accept.setFocusable(true);

    holder.accept.setClickable(true);
    holder.headlineView.setText(Html.fromHtml(newsItem.getTitle()));
    holder.reportedDateView.setText(Html.fromHtml(newsItem.getContent()));

    holder.accept.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {


                    holder.accept.setText(Html.fromHtml(newsItem.getContent()));
        }
    });



    return convertView;
}




static class ViewHolder
{

    TextView accept;
    TextView headlineView;
    TextView reportedDateView;
    ImageView imageView;
    FeedItem newsItem;

}

Raghunandan.. 6

您需要了解listview循环机制的工作原理

ListView的回收机制如何运作

使用模型类.假设您已经拥有以下内容

public class FeedItem {

String title,content;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

}

getView

holder.accept.setText(listData.get(position).getContent()); 
holder.accept.setTag(position);
holder.accept.setOnClickListener(mClickListener);

然后

private OnClickListener mClickListener = new OnClickListener() {
public void onClick(View v) {
    int pos = (Integer) v.getTag();
    FeedItem newsItem = (FeedItem) listData.get(pos);
    newsItem.setContent("Accepted");
    CustomListadapter.this.notifyDataSetChanged();
}
};

Exaplanation:

您使用具有getter和setter的模型类.

setTag到有位置的按钮.在onClick中,您获得标记即位置并相应地更改内容.您可以通过调用notifyDataSetChanged适配器来刷新列表视图.

为了别人的利益,这里有一个例子

public class MainActivity extends Activity {

   ArrayList list = new ArrayList();
   ListView lv;
   CustomListAdapter cus;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.listView1);
        for(int i=0;i<10;i++)
        {
            Holder h = new Holder();
            h.setTitle("Title"+i);
            h.setContent("Content"+i);
            h.setColor(Color.BLACK);
            list.add(h);
        }
        cus = new CustomListAdapter(this,list);
        lv.setAdapter(cus);
    }
}

型号类持有人

public class Holder {

    String title,content;
    int color;

    public int getColor() {
return color;

    public void setColor(int color) {
this.color = color;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

CustomListAdapter

public class CustomListAdapter extends BaseAdapter{

    LayoutInflater inflater;
    ArrayList list;
    public CustomListAdapter(MainActivity mainActivity, ArrayList list) {
        inflater = LayoutInflater.from(mainActivity);
        this.list =list;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.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;
    }
    public View getView(int position, View convertView, ViewGroup parent) { 
        ViewHolder holder; 
        if (convertView == null) { 
            convertView = inflater.inflate(R.layout.list_item, 
                    parent, false);
            holder = new ViewHolder(); 
            holder.tv = (TextView) convertView.findViewById(R.id.textView1); 
            holder.b = (Button) convertView.findViewById(R.id.button1);
           convertView.setTag(holder); 
       } else { 
           holder = (ViewHolder) convertView.getTag(); 
       } 
       Holder h = list.get(position);
       holder.tv.setText(h.getTitle());
       holder.b.setText(h.getContent());
       holder.b.setTextColor(h.getColor());
       holder.b.setOnClickListener(mClickListener); 
       holder.b.setTag(position);
       return convertView; 
}
     private OnClickListener mClickListener = new OnClickListener() {

            public void onClick(View v) {
                int pos = (Integer) v.getTag();
                Holder h = (Holder) list.get(pos);
                h.setContent("Accepted");
                    h.setColor(Color.BLUE);
                CustomListAdapter.this.notifyDataSetChanged();

            }

            };
    static class ViewHolder
    {
        TextView tv;
        Button b;
    }
}

list_item.xml




    

activity_main.xml中


    
    


快照

单击第1行和第5行的按钮,将其更改为"已接受"并为蓝色.

在此输入图像描述

1 个回答
  • 您需要了解listview循环机制的工作原理

    ListView的回收机制如何运作

    使用模型类.假设您已经拥有以下内容

    public class FeedItem {
    
    String title,content;
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getContent() {
        return content;
    }
    
    public void setContent(String content) {
        this.content = content;
    }
    
    }
    

    getView

    holder.accept.setText(listData.get(position).getContent()); 
    holder.accept.setTag(position);
    holder.accept.setOnClickListener(mClickListener);
    

    然后

    private OnClickListener mClickListener = new OnClickListener() {
    public void onClick(View v) {
        int pos = (Integer) v.getTag();
        FeedItem newsItem = (FeedItem) listData.get(pos);
        newsItem.setContent("Accepted");
        CustomListadapter.this.notifyDataSetChanged();
    }
    };
    

    Exaplanation:

    您使用具有getter和setter的模型类.

    setTag到有位置的按钮.在onClick中,您获得标记即位置并相应地更改内容.您可以通过调用notifyDataSetChanged适配器来刷新列表视图.

    为了别人的利益,这里有一个例子

    public class MainActivity extends Activity {
    
       ArrayList<Holder> list = new ArrayList<Holder>();
       ListView lv;
       CustomListAdapter cus;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.listView1);
            for(int i=0;i<10;i++)
            {
                Holder h = new Holder();
                h.setTitle("Title"+i);
                h.setContent("Content"+i);
                h.setColor(Color.BLACK);
                list.add(h);
            }
            cus = new CustomListAdapter(this,list);
            lv.setAdapter(cus);
        }
    }
    

    型号类持有人

    public class Holder {
    
        String title,content;
        int color;
    
        public int getColor() {
    return color;
    
        public void setColor(int color) {
    this.color = color;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
    }
    

    CustomListAdapter

    public class CustomListAdapter extends BaseAdapter{
    
        LayoutInflater inflater;
        ArrayList<Holder> list;
        public CustomListAdapter(MainActivity mainActivity, ArrayList<Holder> list) {
            inflater = LayoutInflater.from(mainActivity);
            this.list =list;
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.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;
        }
        public View getView(int position, View convertView, ViewGroup parent) { 
            ViewHolder holder; 
            if (convertView == null) { 
                convertView = inflater.inflate(R.layout.list_item, 
                        parent, false);
                holder = new ViewHolder(); 
                holder.tv = (TextView) convertView.findViewById(R.id.textView1); 
                holder.b = (Button) convertView.findViewById(R.id.button1);
               convertView.setTag(holder); 
           } else { 
               holder = (ViewHolder) convertView.getTag(); 
           } 
           Holder h = list.get(position);
           holder.tv.setText(h.getTitle());
           holder.b.setText(h.getContent());
           holder.b.setTextColor(h.getColor());
           holder.b.setOnClickListener(mClickListener); 
           holder.b.setTag(position);
           return convertView; 
    }
         private OnClickListener mClickListener = new OnClickListener() {
    
                public void onClick(View v) {
                    int pos = (Integer) v.getTag();
                    Holder h = (Holder) list.get(pos);
                    h.setContent("Accepted");
                        h.setColor(Color.BLUE);
                    CustomListAdapter.this.notifyDataSetChanged();
    
                }
    
                };
        static class ViewHolder
        {
            TextView tv;
            Button b;
        }
    }
    

    list_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_ >
    
        <Button
            android:id="@+id/button1"
            android:layout_
            android:layout_
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="40dp"
            android:text="Button" />
    
        <TextView
            android:id="@+id/textView1"
            android:layout_
            android:layout_
            android:layout_alignBottom="@+id/button1"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="22dp"
            android:text="TextView" />
    
    </RelativeLayout>
    

    activity_main.xml中

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_
        android:layout_
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
        <ListView
            android:id="@+id/listView1"
            android:layout_
            android:layout_
            >
        </ListView>
    
    </RelativeLayout>
    

    快照

    单击第1行和第5行的按钮,将其更改为"已接受"并为蓝色.

    在此输入图像描述

    2023-02-10 10:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有