Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有按钮和静态字符串数组的ListView_Java_Android_Listview_Android Listview - Fatal编程技术网

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

}

}