当前位置:   article > 正文

Android ListView中Button的点击修改文字颜色

android listview 文字颜色

1. 概述

在开发过程中,有时候会遇到这种需求,如下图所示:

78b494419c7b

图片.png

这个列表是一个listview,领券购买是这个item中的一个 button,要实现的需求是这样的:

点击领券购买,让文字变为已领券;

点击已领券,让文字恢复为领券购买;

2. 做法如下

错误做法:

自己刚开始做的时候,采用的方法是:点击领券购买的button时直接修改文字为已领券,当再次点击时让文字为恢复为领券购买时。这样做是有问题的,问题就是:如果数据较少,只有一屏的话是可以的,如果数据大于一屏,上下滑动时刚才点击的文字就又会变为领券购买,而且可能在第二屏幕或者其他屏幕数据也会变成已领券,造成数据错乱;

原因就是:由于listview的 convertView的复用机制造成的;

正确做法:

我们可以判断item中的 TextView被点击了、Button被点击了、还是item被点击了,但是却不能判断我们点击的是哪个 item中的 TextView或者Button,这里可以采用一种方式:就是在 MyAdapter中的 getView()方法中,通过 View 的setTag(int key , Object tag)方法给每个被点击的控件设置一个 tag标记,第一个参数必须是 该控件的id,这个可以在 res -> values 下边创建 ids.xml文件,然后把 点击 该控件的id 写到里边就可以;

3. 具体步骤

1>:让 MyAdapter 实现View.OnClickListener接口,然后重写 onClick方法;

2>:在 MyAdapter 中定义接口Callback,用于在MainActivity中回调 点击item中的 textView 和 button;

3>:在 res -> values 下边创建 ids.xml文件,然后把 点击 该控件的id 写到里边就可以;

4>:然后在 MyAdapter中的 getView()方法中:

用 viewHolder.textView.setTag(R.id.tv,position)给 textView 设置tag标记;

用 viewHolder.button.setTag(R.id.btn,position)给 Button 设置tag标记;

然后给 textView和button设置点击事件;

5>:然后在 ListViewActivity中实现 MyAdapter 中定义接口Callback,然后重写click方法,在 这个方法中:

调用view.getTag(R.id.tv) 获取textView,返回tv;

调用view.getTag(R.id.btn) 获取button,返回 btn;

6>:然后 从data数据中 根据判断返回的 btn判断:

如果当前文字是 领券购买,则修改文字为 已领券;

如果当前文字是 已领券,则修改文字为 领券购买;

4. 代码如下

1>:ListViewActivity如下:

/**

* Email: 2185134304@qq.com

* Created by Novate 2018/8/13 15:25

* Version 1.0

* Params:

* Description:

*/

public class ListViewActivity extends AppCompatActivity implements MyAdapter.Callback,AdapterView.OnItemClickListener{

//ListView控件

private ListView mList;

//ListView数据源

private List data;

private MyAdapter adapter ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.listview_main);

data = new ArrayList();

mList = (ListView)findViewById(R.id.mList);

for(int i = 0; i < 20; i ++){

AppBean appBean = new AppBean();

appBean.setAppName("斗鱼APP"+i);

appBean.setDownloadStatus("安装");

data.add(appBean);

}

adapter = new MyAdapter(data,this);

mList.setAdapter(adapter);

mList.setOnItemClickListener(this);

}

/**

* MyAdapter中 点击item中的 TextView或者Button 接口定义的方法

*/

@Override

public void click(View view) {

switch (view.getId()){

case R.id.mTv:

int tv = (int) view.getTag(R.id.tv);

Toast.makeText(ListViewActivity.this,"我是文本"+tv,Toast.LENGTH_SHORT).show();

break;

case R.id.mBtn:

int btn = (int) view.getTag(R.id.btn);

Toast.makeText(ListViewActivity.this,"我是按钮"+btn,Toast.LENGTH_SHORT).show();

if (data.get(btn).getDownloadStatus().equals("已安装")){

data.get(btn).setDownloadStatus("安装");

}else if(data.get(btn).getDownloadStatus().equals("安装")){

data.get(btn).setDownloadStatus("已安装");

}

updateItem(btn);

//adapter.notifyDataSetChanged(); //更新全部

break;

}

}

//listView局部更新

private void updateItem(int position) {

//屏幕中第一个可见的条目位置

int firstVisiblePosition = mList.getFirstVisiblePosition();

//屏幕中最后一个可见的条目位置

int lastVisiblePosition = mList.getLastVisiblePosition();

//在看见范围内才更新,不可见的滑动后自动会调用getView方法更新

if (position >= firstVisiblePosition && position <= lastVisiblePosition) {

//获取指定位置view对象

View view = mList.getChildAt(position - firstVisiblePosition);

adapter.getView(position, view, mList);

}

}

@Override

public void onItemClick(AdapterView> adapterView, View view, int i, long l) {

Toast.makeText(ListViewActivity.this,"我是条目"+i,Toast.LENGTH_SHORT).show();

}

}

2>:MyAdapter如下:

/**

* Created by Administrator on 2018/8/13.

*/

public class MyAdapter extends BaseAdapter implements View.OnClickListener {

//上下文

private Context context;

//数据项

private List data;

private Callback mCallback;

public MyAdapter(List data,Callback callback){

this.data = data;

mCallback = callback;

}

@Override

public int getCount() {

return data == null ? 0 : data.size();

}

@Override

public Object getItem(int position) {

return data.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup viewGroup) {

System.out.println("position:"+position+"convertView:"+convertView);

ViewHolder viewHolder = null;

if(context == null) {

context = viewGroup.getContext();

}

if(convertView == null){

convertView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_button,null);

viewHolder = new ViewHolder();

viewHolder.textView = (TextView)convertView.findViewById(R.id.mTv);

viewHolder.button = (Button)convertView.findViewById(R.id.mBtn);

//为convertView设置tag标志

convertView.setTag(viewHolder);

}

//获取viewHolder实例

viewHolder = (ViewHolder)convertView.getTag();

//设置数据

viewHolder.textView.setText(data.get(position).getAppName());

viewHolder.button.setText(data.get(position).getDownloadStatus());

//为viewHolder.mTv和viewHolder.mBtn设置tag标记

viewHolder.textView.setTag(R.id.tv,position);

viewHolder.button.setTag(R.id.btn,position);

//设置监听事件

viewHolder.textView.setOnClickListener(this);

viewHolder.button.setOnClickListener(this);

return convertView;

}

@Override

public void onClick(View view) {

mCallback.click(view);

}

static class ViewHolder{

TextView textView;

Button button;

}

public interface Callback {

void click(View view);

}

}

3>:AppBean如下:

/**

* Created by Administrator on 2018/8/13.

*/

public class AppBean implements Serializable {

private String appName ;

private String downloadStatus ;

public String getAppName() {

return appName;

}

public void setAppName(String appName) {

this.appName = appName;

}

public String getDownloadStatus() {

return downloadStatus;

}

public void setDownloadStatus(String downloadStatus) {

this.downloadStatus = downloadStatus;

}

}

4>:res -> values下边创建 ids.xml文件:

name="btn" type="id" >

name="tv" type="id">

5. 注意事项

在实际开发过程中上边的 领劵购买变为已领劵、立即抢购变为已抢购,这两个状态是由服务器控制的,不管上边的列表使用 lv还是rv 写的列表,自己需要做的就是:区分开点击的是领劵购买还是立即抢购,然后直接调用接口,接口调用成功后,服务器会给你判断好,比如:

点击领劵购买,服务器会把领劵购买状态变为已领劵状态;

点击立即抢购,服务器会把立即抢购状态变为已抢购状态;

然后自己还需要重新调用列表接口,用于刷新下状态就可以;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/293707
推荐阅读
相关标签
  

闽ICP备14008679号