gpt4 book ai didi

java - 更改 ListView 背景 - 奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:10 25 4
gpt4 key购买 nike

我在更改 ListView 中的 View 背景时遇到问题。

我需要什么:
改变某行的背景图片 onClick()

实际发生了什么:
按例如后,背景会更改(选择)第一个条目。但在向下滚动后,第 8 个条目也被选中。滚动回到顶部,第一个不再被选中。现在选择第二个条目。继续滚动,它继续跳跃......

我在代码中的作用:
我有 channel ,并且 onClick() 我切换 channel 的属性 boolean selected然后我改变背景。我在onClick() 上执行此操作,这就是为什么我不明白为什么其他条目也会发生这种情况。我注意到的一件事是:它似乎只是“绘图”部分,因为“自己”选择的项目在 false 上仍然具有 selected

我认为这似乎与自定义 ListAdapters getView(...) 中 View 的重用有关

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;
}

getView(...) 代码:

@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;
}

我真的很想知道如何解决这个问题! :)

如果需要更多信息,请告诉我。

提前致谢!

最佳答案

让我向您展示我用于每个 ListView 的代码,并正确控制点击事件以更改背景并做任何进一步的事情

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;
}

}

officeslistitemlayout.xml 文件会像下面添加drawable 并根据您的设计将以下代码放在RelativeLayout 中

 <ImageView android:id="@+id/OfficesBackground" android:layout_width="fill_parent"       
android:layout_height="45dip"
android:layout_alignParentTop="true"
android:background="@drawable/and_gray_bg_listing"
android:scaleType="fitXY"
></ImageView>


<TextView android:id="@+id/OfficesName" android:layout_width="wrap_content"
android:text="Offices Name"
android:textColor="#000000" android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_marginLeft="5dip"
></TextView>

希望对你有帮助:)

关于java - 更改 ListView 背景 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4583349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com