Java 更改ListView背景-奇怪的行为
我在更改ListView中视图的背景时遇到问题 我需要什么:Java 更改ListView背景-奇怪的行为,java,android,listview,onclick,background-image,Java,Android,Listview,Onclick,Background Image,我在更改ListView中视图的背景时遇到问题 我需要什么: 更改行onClick()的背景图像 实际发生的情况: 按下第一个条目后,背景会发生变化(选定)。但向下滚动后,第8个条目也被选中。 如果第一个选项不再被选中,请滚动回顶部。现在选择第二个条目。 继续滚动,它继续跳跃 我在代码中是什么: 我有通道,onClick()我切换通道布尔值的属性 然后我改变背景。 我只做了这个onClick(),这就是为什么我不明白为什么它实际上也发生在其他条目上。 我注意到的一件事是:它似乎只是“绘图”部分,
更改行onClick()的背景图像 实际发生的情况:
按下第一个条目后,背景会发生变化(选定)。但向下滚动后,第8个条目也被选中。 如果第一个选项不再被选中,请滚动回顶部。现在选择第二个条目。 继续滚动,它继续跳跃 我在代码中是什么:
我有通道,onClick()我切换通道布尔值的属性 然后我改变背景。 我只做了这个onClick(),这就是为什么我不明白为什么它实际上也发生在其他条目上。 我注意到的一件事是:它似乎只是“绘图”部分,因为“由它自己”选择的项目仍然具有selected值false 我认为这似乎与重用自定义ListAdapters getView中的视图有关(…) ListActivity中onClick()的代码:
@Override
protected ViewHolder createHolder(View v) {
// createHolder will be called only as long, as the ListView is not
// filled
TextView title = (TextView) v
.findViewById(R.id.tv_title_channel_list_adapter);
TextView content = (TextView) v
.findViewById(R.id.tv_content_channel_list_adapter);
ImageView icon = (ImageView) v
.findViewById(R.id.icon_channel_list_adapter);
if (title == null || content == null || icon == null) {
Log.e("ERROR on findViewById",
"Couldn't find Title, Content or Icon");
}
ViewHolder mvh = new MyViewHolder(title, content, icon);
// We make the views become clickable
// so, it is not necessary to use the android:clickable attribute in
// XML
v.setOnClickListener(new ChannelListAdapter.OnClickListener(mvh) {
public void onClick(View v, ViewHolder viewHolder) {
// we toggle the enabled state and also switch the the
// background
MyViewHolder mvh = (MyViewHolder) viewHolder;
Channel ch = (Channel) mvh.data;
ch.setSelected(!ch.getSelected()); // toggle
if (ch.getSelected()) {
v.setBackgroundResource(R.drawable.row_blue_selected);
} else {
v.setBackgroundResource(R.drawable.row_blue);
}
// TESTING
Log.d("onClick() Channel", "onClick() Channel: "
+ ch.getTitle() + " selected: " + ch.getSelected());
}
});
return mvh;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
// When view is not null, we can reuse it directly, there is no need
// to reinflate it.
// We only inflate a new View when the view supplied by ListView is
// null.
if (view == null) {
view = mInflater.inflate(mViewId, null);
// call own implementation
holder = createHolder(view);
// TEST
// we set the holder as tag
view.setTag(holder);
} else {
// get holder back...much faster than inflate
holder = (ViewHolder) view.getTag();
}
// we must update the object's reference
holder.data = getItem(position);
// <EDIT SOLUTION>
if(getItem(position).get_id() == channelList.get(position).get_id()){
if(getItem(position).getSelected())
{
view.setBackgroundResource(R.drawable.row_blue_selected);
}
else{
view.setBackgroundResource(R.drawable.row_blue);
}
}
// </EDIT SOLUTION>
// call the own implementation
bindHolder(holder);
return view;
}
getView(…)的代码:
@Override
protected ViewHolder createHolder(View v) {
// createHolder will be called only as long, as the ListView is not
// filled
TextView title = (TextView) v
.findViewById(R.id.tv_title_channel_list_adapter);
TextView content = (TextView) v
.findViewById(R.id.tv_content_channel_list_adapter);
ImageView icon = (ImageView) v
.findViewById(R.id.icon_channel_list_adapter);
if (title == null || content == null || icon == null) {
Log.e("ERROR on findViewById",
"Couldn't find Title, Content or Icon");
}
ViewHolder mvh = new MyViewHolder(title, content, icon);
// We make the views become clickable
// so, it is not necessary to use the android:clickable attribute in
// XML
v.setOnClickListener(new ChannelListAdapter.OnClickListener(mvh) {
public void onClick(View v, ViewHolder viewHolder) {
// we toggle the enabled state and also switch the the
// background
MyViewHolder mvh = (MyViewHolder) viewHolder;
Channel ch = (Channel) mvh.data;
ch.setSelected(!ch.getSelected()); // toggle
if (ch.getSelected()) {
v.setBackgroundResource(R.drawable.row_blue_selected);
} else {
v.setBackgroundResource(R.drawable.row_blue);
}
// TESTING
Log.d("onClick() Channel", "onClick() Channel: "
+ ch.getTitle() + " selected: " + ch.getSelected());
}
});
return mvh;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
// When view is not null, we can reuse it directly, there is no need
// to reinflate it.
// We only inflate a new View when the view supplied by ListView is
// null.
if (view == null) {
view = mInflater.inflate(mViewId, null);
// call own implementation
holder = createHolder(view);
// TEST
// we set the holder as tag
view.setTag(holder);
} else {
// get holder back...much faster than inflate
holder = (ViewHolder) view.getTag();
}
// we must update the object's reference
holder.data = getItem(position);
// <EDIT SOLUTION>
if(getItem(position).get_id() == channelList.get(position).get_id()){
if(getItem(position).getSelected())
{
view.setBackgroundResource(R.drawable.row_blue_selected);
}
else{
view.setBackgroundResource(R.drawable.row_blue);
}
}
// </EDIT SOLUTION>
// call the own implementation
bindHolder(holder);
return view;
}
@覆盖
公共视图getView(内部位置、视图视图、视图组父视图){
视窗座;
//当视图不为空时,我们可以直接重用它,没有必要
//让它重新膨胀。
//我们仅在ListView提供的视图为
//空。
如果(视图==null){
视图=最小充气机充气(mViewId,null);
//调用自己的实现
holder=createHolder(视图);
//试验
//我们将支架设置为标签
视图.设置标签(支架);
}否则{
//拿回支架…比充气快得多
holder=(ViewHolder)view.getTag();
}
//我们必须更新对象的引用
holder.data=getItem(位置);
//
if(getItem(position).get_id()==channelList.get(position).get_id()){
if(getItem(position).getSelected())
{
视图.setBackgroundResource(R.drawable.row\u blue\u选中);
}
否则{
视图.setBackgroundResource(R.可绘制.蓝色行);
}
}
//
//调用自己的实现
活页夹(活页夹);
返回视图;
}
我真的很想知道如何解决这个问题!:)
如果需要更多信息,请告诉我
提前感谢让我向您展示我在每个
列表视图中使用的代码,并正确控制用于更改背景和进一步操作的单击事件
public class Offices extends Activity {
private ListView listView;
/* selectedListItem will contain the number of items to be selected.
* Your list item OnOlickListener will simply change this variable
* to the position of the clicked item. The Adapter will do the rest
* because you need to refresh the ListView.
*/
private int selectedListItem = -1;
private Handler mHandler = new Handler();
private Vector<String> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.officeslayout);
data = new Vector<String>();
// Add data as per your requirement
data.add("one");
data.add("two");
data.add("three");
data.add("four");
data.add("Five");
data.add("Six");
data.add("Seven");
data.add("Eight");
data.add("Nine");
data.add("Ten");
listView = (ListView)findViewById(R.id.ListView01);
listView.setDivider(null);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
selectedListItem = position;
((EfficientAdapter)listView.getAdapter()).notifyDataSetChanged();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// call any new activity here or do any thing you want here
}
}, 200L);
}
});
listView.setAdapter(new EfficientAdapter(getApplicationContext()));
}
private class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null || convertView.getTag() == null) {
convertView = mInflater.inflate(R.layout.officeslistitemlayout, null);
holder = new ViewHolder();
holder.backgroundView = (ImageView) convertView
.findViewById(R.id.OfficesBackground);
holder.officesTitle = (TextView) convertView
.findViewById(R.id.OfficesName);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if(position == selectedListItem) {
holder.backgroundView.setBackgroundResource(R.drawable.and_gray_bg_listing_selected);
} else {
holder.backgroundView.setBackgroundResource(R.drawable.and_gray_bg_listing);
}
holder.officesTitle.setText(data.get(position));
return convertView;
}
}
static class ViewHolder {
TextView officesTitle;
ImageView backgroundView;
}
}
公共类办公室扩展活动{
私有列表视图列表视图;
/*selectedListItem将包含要选择的项目数。
*您的列表项OnClickListener只需更改此变量即可
*到单击项的位置。适配器将完成其余操作
*因为您需要刷新ListView。
*/
private int selectedListItem=-1;
私有处理程序mHandler=新处理程序();
专用矢量数据;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.officeslayout);
数据=新向量();
//根据您的要求添加数据
数据。添加(“一”);
数据。添加(“两”);
数据。添加(“三”);
数据。添加(“四”);
数据。添加(“五”);
数据。添加(“六”);
数据。添加(“七”);
数据。添加(“八”);
数据。添加(“九”);
数据。添加(“十”);
listView=(listView)findViewById(R.id.ListView01);
setDivider(null);
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
selectedListItem=位置;
((EfficientAdapter)listView.getAdapter()).notifyDataSetChanged();
mHandler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
//在这里呼叫任何新活动或做任何你想做的事情
}
},200L);
}
});
setAdapter(新的EfficientAdapter(getApplicationContext());
}
私有类EfficientAdapter扩展BaseAdapter{
私人停车场;
公共效率适配器(上下文){
mInflater=LayoutInflater.from(上下文);
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null | | convertView.getTag()==null){
convertView=mInflater.inflate(R.layout.officeslistitemlayout,null);
holder=新的ViewHolder();
holder.backgroundView=(ImageView)convertView
.findViewById(R.id.OfficesBackground);
holder.officesTitle=(TextView)convertView
.findViewById(R.id.OfficesName);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
如果(位置==selectedListItem){
holder.backgroundView.setBackgroundResource(R.drawable.and_gray_bg_listing_selected);
}否则{
holder.backgroundView.setBackgroundResource(R.drawable.and_gray_bg_上市);
}
holder.officetitle.setText(data.get(position));
返回视图;
}
}
静态类