【发布时间】:2013-07-17 18:11:47
【问题描述】:
我有一个 GridView,里面有两个 TextView,当填充 GridView 时,会设置一个 OnClickListener,它返回所选项目的位置。我想在选择其中一个 TextView 时触发一个方法。
这可能吗?如果是,我该如何设置?
编辑 3:
在填充 GridView 的活动中:我从 Strings.xml 中检索 String-Array,for loop 检查 Array 中的每个项目并根据 SharedPreferences 中的项目名称搜索条件,此 @987654324 @ 仅用于计算有多少“真实”条件,因此它检索保存在 count 中的 int。然后创建一个新的String[],这需要在添加项目之前给出一个确切的长度,所以我检查count,如果它大于0,它会给String[]一个长度count然后另一个for loop 会将每个true 添加到我们刚刚创建的String[] 列表中。如果 count 为 0(在第一个 for loop 中没有找到真正的条件),则只有 1 个项目被添加到 String[] 并被赋予值“未添加收藏夹”。
然后你就有了 GridView 的 OnItemClickListener()。
String s[] = getResources().getStringArray(R.array.FullList);
int count = 0;
for(int i = 0; i < s.length; i++) {
SharedPreferences sP = getActivity().getSharedPreferences("fav", MODE_PRIVATE);
Boolean b = sP.getBoolean(s[i], false);
if (b == true) {
count++;
}
}
String[] newList;
if (count > 0) {
newList = new String[count];
count = 0;
for(int i = 0; i < s.length; i++) {
SharedPreferences sP = getActivity().getSharedPreferences("fav", MODE_PRIVATE);
Boolean b = sP.getBoolean(s[i], false);
if (b == true) {
newList[count] = s[i];
count++;
}
}
} else {
newList = new String[1];
newList[0] = "No favourites added";
}
GridView FavGV = (GridView) getActivity().findViewById(R.id.sexp_fav);
FavGV.setAdapter(new Tab01_FavAdapter(getActivity(), newList));
FavGV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0,
View arg1, int position, long arg3) {
//Intent i = new Intent(getActivity(), PosPreview_Gestures.class);
//i.putExtra("position", position);
//startActivity(i);
}
});
这就是填充 GridView 的 Activity 中的代码。适配器的原始功能形式:这只是用最喜欢的项目(它们的名称来自 String[])填充 GridView,并添加一个带有“Remove”的 TextView,当按下它时,会显示一个 Toast:“Remove”。
public class Tab01_FavAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflator;
String mEntries[];
public Tab01_FavAdapter (Context c, String[] entries) {
mContext = c;
mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mEntries = entries;
}
@Override
public int getCount() {
return mEntries.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflator.inflate(R.layout.favitemlayout, parent, false);
}
TextView tx = (TextView) convertView.findViewById(R.id.favgridremoveitem);
OnClickListener oCL = new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"Remove",Toast.LENGTH_SHORT).show();
}
};
tx.setOnClickListener(oCL);
return convertView;
}
}
【问题讨论】:
-
我在答案中添加了一些代码。如果代码中的某些内容不清楚,请随时询问。
-
我有几个问题要问你。你能解释一下 Grid 项目包含什么吗?你在哪里使用
String数组s?在final MyObjectClass info = mEntries.get(position);行中,您需要将MyObjectClass更改为String并将mEntries更改为s。此外,在重写的getItem(int position)方法中,将return position;替换为return s[position]。 -
您还需要静态 ViewHolder 类。在
String s[];之后粘贴public static class ViewHolder { public TextView tx; }。可以发一下布局文件R.layout.favitemlayout吗? -
GridView 包含收藏项列表。这些项目在 s 数组中。在 Activity 内部创建 GridView 适配器时,它会将 s 数组传递给适配器的构造函数。编辑:gridview 中的每个项目都将具有收藏夹的名称和一个显示“删除”的 TextView。按下名称时,它会打开项目 - 这是我的 Activity 中的 GridView onClickListener。当按下 Remove 时,它会检索 GridView 项目的项目名称/位置,并调用 favRemove() 来处理该信息并从列表中删除该项目。
-
请参阅上面的编辑 3。这是我的原始代码,并解释了它的作用。我需要它来列出我最喜欢的项目,每个项目都有自己的删除按钮 (TextView),当按下该按钮时,它会调用 favRemove(String itemName, int itemPos)。然而,如果 Item 本身被按下(而不是里面的 Remove 按钮),我希望它触发 OnItemClickListener:正如您在上面的 Edit 3 代码中看到的那样,这已经设置好了。如果你能让这部分发挥作用,我会从那里拿走它:)