android - 如何在 ListView onClickListener 中获取调用对象方法?
问题描述
我是一个相对较新的程序员。我正在制作一个 ListView,当单击其中一项时,两个或三个单独的 TextView(取决于方向)应更改为对象“Flick”中包含的变量之一。假设我已经在单独的文件中设置了方法(.getDirector() 返回导演),我将如何在 ListView 的 OnItemClickListener 中调用该方法?此外,应该有一个通过单击按钮来删除项目的功能,但它会在方向改变时重置;我应该如何处理?
public class MainActivity extends AppCompatActivity {
ListView listPort;
ListView listLand;
ArrayList<Flick> flicks;
TextView description;
TextView year;
TextView director;
TextView rating;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listPort = findViewById(R.id.listPort);
listLand = findViewById(R.id.listPort);
description = findViewById(R.id.description);
year = findViewById(R.id.year);
director = findViewById(R.id.director);
flicks = new ArrayList<>();
flicks.add(new Flick("Wizard of Oz", "Metro-Goldwyn-Mayer", "VARIOUS","1939", "", "98"));
flicks.add(new Flick("Star Wars", "LucasFilm", "George Lucas", "1977","","93"));
flicks.add(new Flick("Psycho","Paramount", "Alfred Hitchcock", "1960", "", "97"));
flicks.add(new Flick("King Kong", "RKO Pictures", "Merian C. Cooper & Ernest B. Schoedsack", "1933", "", "98"));
flicks.add(new Flick("2001: A Space Odyssey", "Metro-Goldwyn-Mayer", "Stanley Kubrick", "1968", "", "93"));
flicks.add(new Flick("Citizen Kane", "RKO Pictures", "Orson Welles", "1941", "", "100"));
flicks.add(new Flick("Snow White and the Seven Dwarfs", "Walt Disney Pictures", "VARIOUS", "1937", "","98"));
flicks.add(new Flick("Casablanca", "Warner Bros.", "Michael Curtiz", "1942", "", "97"));
flicks.add(new Flick("The Godfather", "Paramount", "Francis Ford Coppola", "1972", "", "98"));
flicks.add(new Flick("Jaws", "Universal", "Steven Spielberg", "1975", "", "97"));
final CustomAdapter customAdapter = new CustomAdapter(this, R.layout.custom_layout, flicks);
if(listPort != null)
listPort.setAdapter(customAdapter);
else
listLand.setAdapter(customAdapter);
listPort.setClickable(true);
listPort.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
description.setText(flicks.get(position).getThoughts());
year.setText("Year Released: " + flicks.get(position).getYear());
director.setText("Director: " + flicks.get(position).getDirector());
rating.setText("Rating" + flicks.get(position).getRating());
customAdapter.notifyDataSetChanged();
}
});
}
public class CustomAdapter extends ArrayAdapter<Flick>
{
Context context;
int resource;
List<Flick> list;
public CustomAdapter(@NonNull Context context, int resource, @NonNull List<Flick> objects) {
super(context, resource, objects);
this.context=context;
this.resource=resource;
list = objects;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
final View adapterView=layoutInflater.inflate(resource,null);
TextView title = adapterView.findViewById(R.id.title);
ImageView imageView=adapterView.findViewById(R.id.imageView);
Button remove=adapterView.findViewById(R.id.remove);
title.setText(list.get(position).getTitle());
switch(list.get(position).getStudio())
{
case "Warner Bros.":
imageView.setImageResource(R.drawable.warnerbros);
break;
case "Paramount":
imageView.setImageResource(R.drawable.paramount);
break;
case "Universal":
imageView.setImageResource(R.drawable.universal);
break;
case "LucasFilm":
imageView.setImageResource(R.drawable.lucasfilm);
break;
case "RKO Pictures":
imageView.setImageResource(R.drawable.rko);
break;
case "Walt Disney Pictures":
imageView.setImageResource(R.drawable.disney);
break;
case "Metro-Goldwyn-Mayer":
imageView.setImageResource(R.drawable.mgm);
break;
}
remove.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
list.remove(position);
flicks.remove(position);
notifyDataSetChanged();
LayoutInflater layoutInflater=(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
final View adapterView=layoutInflater.inflate(resource,null);
}
});
return adapterView;
}
}
}
解决方案
暂时忘记吧OnItemClickListener
。
在getView()
您的类的方法中Adaptor
,您可以从列表中获取所需的任何 Flick 对象,如下所示:
Flick flick = (Flick) list.get(position);
String director = flick.getDirector();
您可以在列表行中的String
任何s 处设置它。TextView
TextView title = .....
title.setText(director);
所以基本上,getView()
方法负责列表中的每个Flick 对象。
推荐阅读
- image - 如何在 React Js 中创建图像数组
- android - Android app productFlavor versionCode OpenGL ES
- javascript - 传单地图:使用坐标数组绘制的中断路线,如果数组值为 0
- snowflake-cloud-data-platform - 雪花:外部应用/横向
- kotlin - 如何将视图边距绑定到视图模型字符串实时数据?
- angular - 如何在 Angular FontAwesone 中正确堆叠 fa 图标
- algorithm - 平均情况下 nlogn 螺母和螺栓匹配
- python - 如何使用 python 将多个文本文件中的整数加到一个新的文本文件中?
- solidity - Chainlink 上的 VRF 协调器合约是什么?
- google-cloud-platform - 什么问题导致 Google AI Platform 视频批量预测无法处理输入文件