Java 带有按钮和静态字符串数组的ListView
我想创建一个Java 带有按钮和静态字符串数组的ListView,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我想创建一个列表视图,其中每个行都有两个按钮按钮1和按钮2 我读过一些关于如何创建CustomAdapter或扩展BaseAdapter的教程,但这些教程都不适用于我的情况,这就是我在这里提出新问题的原因 我的strings.xml中有一个静态(不更改)字符串数组: <string-array name="locations_array"> <item>Item1</item> <item>Item2</it
列表视图
,其中每个行
都有两个按钮<代码>按钮1和按钮2
我读过一些关于如何创建CustomAdapter
或扩展BaseAdapter
的教程,但这些教程都不适用于我的情况,这就是我在这里提出新问题的原因
我的strings.xml中有一个静态(不更改)字符串数组:
<string-array name="locations_array">
<item>Item1</item>
<item>Item2</item>
</string-array>
这里我使用片段中的适配器:
locationsArray = getResources().getStringArray(R.array.locations_array);
ArrayList<String> data = new ArrayList<>(Arrays.asList(locationsArray));
CustomAdapter adapter = new CustomAdapter(data,getActivity());
listView.setAdapter(adapter);
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/et_filter"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="Search Location">
</EditText>
<ListView
android:id="@+id/list"
android:layout_height="wrap_content"
android:layout_width="match_parent">
</ListView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/list_item_string"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:paddingLeft="8dp"
android:textSize="18sp"
android:textStyle="bold" />
<Button
android:id="@+id/button1"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="Online Data"
android:textColor="#0099CC" />
<Button
android:id="@+id/button2"
android:layout_width="80dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_below="@+id/button1"
android:layout_marginTop="3dp"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="Local Data"
android:textColor="#0099CC" />
</RelativeLayout>
12-15 11:24:10.852 14626-14626/com.inodroid.myweatherapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.inodroid.myweatherapp, PID: 14626
java.lang.NullPointerException
at com.inodroid.myweatherapp.Data.CustomAdapter.getView(CustomAdapter.java:59)
代码行:
listItemText.setText(list.get(position));
希望有人能帮我
干杯请使用取景器图案。您将需要这些:
项目_listrow.xml:
<LinearLayout
android:layout_height = "match_parent";
andorid:layout_width = "match_parent";
andorid:orientation = "horizontal";
>
<Button
android:id = "@+id/button1"
android:layout_height = "match_parent";
andorid:layout_width = "0dp";
andorid:layout_weight = 1;
/>
<Button
android:id = "@+id/button2"
android:layout_height = "match_parent";
andorid:layout_width = "0dp";
andorid:layout_weight = 1;
/>
</LinaerLayout>
上面使用的Holder类:(只需将其嵌套在适配器类中)
下面是基于给定方法隐藏按钮的代码isDeveloperMode()
:
在适配器中将代码更改为以下内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView== null){
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView= inflater.inflate(R.layout.layout_listview,null);
}
Log.d("TAG", list.get(position));
TextView listItemText = (TextView) convertView.findViewById(R.id.list_item_string);
listItemText.setText(list.get(position));
Button localData = (Button) convertView.findViewById(R.id.button1);
Button onlineData = (Button) convertView.findViewById(R.id.button2);
localData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
onlineData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return convertView;
}
尝试而不是
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null){
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.layout_listview,null);
}
Log.d("TAG", list.get(position));
TextView listItemText = (TextView) view.findViewById(R.id.list_item_string);
使用
请尝试以下操作:
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/lvItems"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
MainActivity.java:
public class MainActivity extends Activity {
private ListView lvItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvItems = (ListView) findViewById(R.id.lvItems);
String[] locationsArray = getResources().getStringArray(
R.array.locations_array);
CustomAdapter adapter = new CustomAdapter(this, locationsArray);
lvItems.setAdapter(adapter);
lvItems.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ViewHolder holder = (ViewHolder) view.getTag();
String item = holder.getItem();
// Do what ever with your Item.
// If You need the position, you can take it from above
// position.
}
});
}
}
公共类MainActivity扩展活动{
私有ListView项目;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvItems=(ListView)findViewById(R.id.lvItems);
字符串[]位置数组=getResources().getStringArray(
R.数组。位置(u数组);
CustomAdapter=新的CustomAdapter(此,位置为RAY);
lvItems.setAdapter(适配器);
setOnItemsClickListener(新的OnItemsClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
ViewHolder=(ViewHolder)view.getTag();
String item=holder.getItem();
//用你的物品做任何事。
//如果你需要这个职位,你可以从上面找
//位置。
}
});
}
}
list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp" >
<Button
android:id="@+id/btnLocalData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="local Data" />
<TextView
android:id="@+id/tvItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/btnLocalData"
android:layout_alignTop="@+id/btnOnlineData"
android:layout_toLeftOf="@+id/btnOnlineData"
android:layout_toRightOf="@+id/btnLocalData"
android:gravity="center"
android:text="Item"
android:textSize="16dp"
android:textStyle="bold" />
<Button
android:id="@+id/btnOnlineData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Online Data" />
</RelativeLayout>
CustomAdapter.java:
public class CustomAdapter extends ArrayAdapter<String> {
private LayoutInflater lf;
public CustomAdapter(Context context, String[] objects) {
super(context, 0, objects);
lf = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = lf.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.btnLocalData = (Button) convertView
.findViewById(R.id.btnLocalData);
holder.btnOnlineData = (Button) convertView
.findViewById(R.id.btnOnlineData);
holder.tvItem = (TextView) convertView.findViewById(R.id.tvItem);
holder.initListeners();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.setData(getItem(position));
return convertView;
}
public static class ViewHolder {
TextView tvItem;
Button btnOnlineData;
Button btnLocalData;
String mItem;
public String getItem(){
return mItem;
}
public void setData(String item) {
mItem = item;
tvItem.setText(item);
}
public void initListeners() {
btnLocalData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Local Data Clicked : " + mItem, Toast.LENGTH_LONG)
.show();
}
});
btnOnlineData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Online Data Clicked : " + mItem, Toast.LENGTH_LONG)
.show();
}
});
}
}
}
公共类CustomAdapter扩展了ArrayAdapter{
私人停车场;
公共CustomAdapter(上下文上下文,字符串[]对象){
超级(上下文,0,对象);
lf=Layoutiner.from(上下文);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
convertView=lf.充气(R.layout.list_项,父项,false);
holder=新的ViewHolder();
holder.btnLocalData=(按钮)转换视图
.findViewById(R.id.btnLocalData);
holder.btnOnlineData=(按钮)convertView
.findViewById(R.id.btnOnlineData);
holder.tvItem=(TextView)convertView.findViewById(R.id.tvItem);
holder.initListeners();
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.setData(getItem(position));
返回视图;
}
公共静态类视图持有者{
文本视图项目;
按钮和非线性数据;
按钮btnLocalData;
弦斜接;
公共字符串getItem(){
返螨;
}
公共void setData(字符串项){
mItem=项目;
tviitem.setText(项目);
}
public void initListeners(){
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(v.getContext(),
单击本地数据:“+mItem,Toast.LENGTH\u LONG)
.show();
}
});
btnOnlineData.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(v.getContext(),
点击在线数据:“+mItem,Toast.LENGTH\u LONG)
.show();
}
});
}
}
}
请粘贴您的R.layout.layout_列表视图文件:-)@Kelevandos啊,对不起,不知道我怎么忘记添加XML文件的。我把它们都挂起来了!我认为堆栈跟踪也会有用,我认为您在适配器中膨胀了错误的xml文件。更改视图=充气机。充气(R.layout.layout\u列表视图,空)代码>至<代码>视图=充气机。充气(R.layout.layout\u listview\u按钮,空)代码>就是这样!哦,我的天啊…太尴尬了,非常感谢你们大家!!代码是手工输入的,因此请原谅任何错误或打字错误;-)我在声明按钮的地方添加了XML。但是我没有使用Holder类,我会尝试添加它。然而,我在我的setText(list.get(position)
上得到了一个LogCat错误“NullPointerException”,这确实有效,但是onClickListeners不起作用,他们不能识别“button1”和“button2”。我应该添加holder.button1吗?事实上,它必须是holder.button1
和holder.button2
(更正了答案)谢谢您的帮助!我现在想知道为什么我的ItemClickListener在我的ListView中不工作?当我从ListView单击Iem时,它什么也不做。没有错误。但它应该将所选项目存储到变量中,但现在它什么也不做。这是一个很好的答案!:)但是现在我遇到了问题,onItemClick for ListView项目不工作。只有按钮点击才能工作。但我也希望ListView中的项目是可点击的,并且有自己的侦听器,我应该如何用我的自定义适配器实现这一点?嘿,又是我。您现在是否知道,我如何才能获得ListView项在单击按钮的同一行中的位置?例如,当我单击按钮时,我希望存储ListView项的文本,该文本与单击的按钮位于同一行。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
Log.d("TAG", list.get(position));
TextView listItemText = (TextView) view.findViewById(R.id.list_item_string);
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/lvItems"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
public class MainActivity extends Activity {
private ListView lvItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvItems = (ListView) findViewById(R.id.lvItems);
String[] locationsArray = getResources().getStringArray(
R.array.locations_array);
CustomAdapter adapter = new CustomAdapter(this, locationsArray);
lvItems.setAdapter(adapter);
lvItems.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ViewHolder holder = (ViewHolder) view.getTag();
String item = holder.getItem();
// Do what ever with your Item.
// If You need the position, you can take it from above
// position.
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp" >
<Button
android:id="@+id/btnLocalData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="local Data" />
<TextView
android:id="@+id/tvItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/btnLocalData"
android:layout_alignTop="@+id/btnOnlineData"
android:layout_toLeftOf="@+id/btnOnlineData"
android:layout_toRightOf="@+id/btnLocalData"
android:gravity="center"
android:text="Item"
android:textSize="16dp"
android:textStyle="bold" />
<Button
android:id="@+id/btnOnlineData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Online Data" />
</RelativeLayout>
public class CustomAdapter extends ArrayAdapter<String> {
private LayoutInflater lf;
public CustomAdapter(Context context, String[] objects) {
super(context, 0, objects);
lf = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = lf.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.btnLocalData = (Button) convertView
.findViewById(R.id.btnLocalData);
holder.btnOnlineData = (Button) convertView
.findViewById(R.id.btnOnlineData);
holder.tvItem = (TextView) convertView.findViewById(R.id.tvItem);
holder.initListeners();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.setData(getItem(position));
return convertView;
}
public static class ViewHolder {
TextView tvItem;
Button btnOnlineData;
Button btnLocalData;
String mItem;
public String getItem(){
return mItem;
}
public void setData(String item) {
mItem = item;
tvItem.setText(item);
}
public void initListeners() {
btnLocalData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Local Data Clicked : " + mItem, Toast.LENGTH_LONG)
.show();
}
});
btnOnlineData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Online Data Clicked : " + mItem, Toast.LENGTH_LONG)
.show();
}
});
}
}
}