在MainActivity中,我创建了Json下载任务,它从http下载数据,并使用Customlistadapter.class填充ListvIEw.
一切正常.
现在,在ListvIEw中我有2个textvIEw,我想要点击,其中一个是“Accept”,textvIEw只是在xml中,它没有填充Adapter或Json.
“接受”应该像这样工作“将文本更改为已接受并更改颜色”,其工作方式与其他所有内容相同.但是当我点击ListvIEw中的第一个“接受”(位置0)时
它会更改其他列表视图项目(位置4,9).这就像我点击了位置4,9上的文本视图.
在第一张图片上点击“接受”之前,第二张图片是点击之后.
///
public class MainActivity extends Activity {protected static final String TAG = null;public ArrayList<FeedItem> 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<String,Integer,VoID> { ///....
Customlistadapter.class
public class Customlistadapter extends BaseAdapter {private ArrayList<FeedItem> ListData;private LayoutInflater layoutInflater;private Context mContext;private ArrayList<String> data;protected ListVIEw FeedListVIEw;ArrayList<HashMap<String,String>> List;public Customlistadapter(Context context,ArrayList<FeedItem> ListData){ this.ListData = ListData; layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mContext = context; data = new ArrayList<String>(); for (int i = 0; i < 10; i++) { data.add("Sample Text " + String.valueOf(i)); }}@OverrIDepublic int getCount(){ return ListData.size();}@OverrIDepublic Object getItem(int position){ return ListData.get(position);}@OverrIDepublic 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;}解决方法 您需要了解ListvIEw循环机制的工作原理
How ListView’s recycling mechanism works
使用模型类.假设您已经拥有以下内容
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@R_877_6419@视图.
为了别人的利益,这里有一个例子
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,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_wIDth="match_parent" androID:layout_height="match_parent" > <button androID:ID="@+ID/button1" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_alignParentRight="true" androID:layout_alignParenttop="true" androID:layout_marginRight="40dp" androID:text="button" /> <TextVIEw androID:ID="@+ID/textVIEw1" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" 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_wIDth="match_parent" androID:layout_height="match_parent" 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_wIDth="match_parent" androID:layout_height="wrap_content" > </ListVIEw></relativeLayout>
快照
单击第1行和第5行的按钮,将其更改为“已接受”并为蓝色.
总结以上是内存溢出为你收集整理的android – ListView子对象可点击的confilct全部内容,希望文章能够帮你解决android – ListView子对象可点击的confilct所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)