我的需要:
我想实现一个可以包含动态no行的变量列表。 此列表包含3个TextViews,1个ImageView,3ImageButtons。
用户可以点击选择一行。长按可以选择多个项目。在选择时,将更改选定的行UI。选定项目会更改其背景和imageview图像,并且在选择时将显示一个图像按钮。
当用户点击ImageButton图像时,将更改图像按钮,其他图像按钮也会变为可见
如果已经选择了某些项目,并且用户尝试通过点击所有其他所选项目来选择单行将被删除。 listview项目应该进入原始状态。像Imageview将重置其默认图像,Imagebutton将消失。
我尝试了什么:
我尝试使用Base适配器实现ListView。定义一个自定义行,需要3个TextViews,1个ImageView和3个ImageButton。
package com.astron.myapplication;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import com.astron.myapplication.R;
import com.astron.myapplication.TSSVariableInfo;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.ListView;
import org.w3c.dom.Text;
import android.widget.TableRow;
import android.view.View;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.Bitmap;
public class MyCustomBaseAdapter extends BaseAdapter {
TSSVariableInfo info[];
private LayoutInflater mInflater;
public MyCustomBaseAdapter(Context context, TSSVariableInfo[] results) {
info = new TSSVariableInfo[results.length];
info = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return info.length;
}
public Object getItem(int position) {
return info[position];
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
DateFormat dateFormatFrom ;
DateFormat dateFormatTo;
Boolean IsRolSeleted = false;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.row, null);
holder = new ViewHolder();
holder.VariableCustomerGivenName = (TextView) convertView.findViewById(R.id.CustomerGivenName);
holder.VariableStandardName = (TextView) convertView.findViewById(R.id.StanddardName);
holder.VariableSectionName = (TextView) convertView.findViewById(R.id.SectionName);
holder.VariableValue = (TextView) convertView.findViewById(R.id.LastValue);
holder.VariableLastDate = (TextView) convertView.findViewById(R.id.LastDate);
holder.VariableLegendImage = (ImageView)convertView.findViewById(R.id.ImgLegend);
holder.VariableLegendImage.setTag(0);
holder.BtnMore = (ImageButton)convertView.findViewById(R.id.btnMore) ;
holder.BtnMore.setTag(0);
holder.BtnY2 = (ImageButton)convertView.findViewById(R.id.btn2y) ;
holder.BtnTL = (ImageButton)convertView.findViewById(R.id.btnTL) ;
convertView.setTag(holder);
convertView.setBackgroundColor(Color.parseColor("#E8E8E8"));
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.VariableCustomerGivenName.setText(info[position].VariableCustomerGivenName);
holder.VariableStandardName.setText(info[position].VariableStandarName);
holder.VariableSectionName.setText(info[position].SectionName);
holder.VariableValue.setText(info[position].Value.toString());
dateFormatFrom = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss aa");
dateFormatTo = new SimpleDateFormat("MM/dd/yy");
java.util.Date dt;
String strdt = info[position].LastDate;
dt = dateFormatFrom.parse(strdt);
dateFormatTo.format(dt);
holder.VariableLastDate.setText(dateFormatTo.format(dt));
//holder.VariableLastDate.setText(dateFormatTo.format(dateFormatFrom.format(info[position].LastDate)));
if(info[position].VariableCustomerGivenName.isEmpty() || info[position].VariableCustomerGivenName==null) {
holder.VariableCustomerGivenName.setText(info[position].VariableStandarName);
holder.VariableStandardName.setText(info[position].SectionName);
holder.VariableSectionName.setVisibility(View.INVISIBLE);
}
else
holder.VariableSectionName.setVisibility(View.VISIBLE);
holder.BtnMore.setVisibility(View.VISIBLE);
return convertView;
}
public void updateAdapter(TSSVariableInfo[] results) {
this.info= results;
//and call notifyDataSetChanged
notifyDataSetChanged();
}
static class ViewHolder {
TextView VariableCustomerGivenName;
TextView VariableStandardName;
TextView VariableSectionName;
TextView VariableValue;
TextView VariableLastDate;
ImageView VariableLegendImage;
ImageButton BtnMore;
ImageButton BtnY2;
ImageButton BtnTL;
}
我的onClick
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
((ImageButton)((LinearLayout) arg1).getChildAt(0).findViewById(R.id.btnMore)).setTag("1");
((ImageButton)((LinearLayout) arg1).getChildAt(0).findViewById(R.id.btnMore)).setVisibility(View.VISIBLE);
ImageView imgLegend = ((ImageView) ((LinearLayout) arg1).getChildAt(0).findViewById(R.id.ImgLegend));
setImageForLegend(imgLegend, info[position].VariableID);
});
遇到问题:
在滚动ListView时选择单行一些其他项目显示我为单行所做的更改。
答案 0 :(得分:0)
首先,不要使用array[]
使用bean
类和getter setter
以及ArrayList
绑定ListView
个项目
参考下面的链接他们如何使用SQLite数据库进行自定义ListView
http://androidtuts4u.blogspot.in/2013/02/android-list-view-using-custom-adapter.html
维护您在bean
课程中设置更改所需的更改
您可能需要更改所有代码,但这只能帮助您。
我的回答可能会因为你不知道的方式而混淆。 请按照上面的链接仔细阅读并执行。