【问题标题】:android setvisibility for button in listviewlistview中按钮的android setvisibility
【发布时间】:2015-08-25 08:55:23
【问题描述】:

我正在解析片段内的 json url 并将数据放入列表视图中。 对于每个元素,我都有一个 ID 为 button1 的隐藏按钮,您可以在我的 xml 布局中看到。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/ler"
    >

    <!-- Thumbnail Image -->
    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/thumbnail"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="8dp"/>

    <!-- Movie Title -->
    <TextView
        android:id="@+id/title"
        android:paddingTop="40dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/thumbnail"
        android:layout_toRightOf="@+id/thumbnail"
        android:textSize="@dimen/title"
        android:textColor="@color/bastru"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/desc"
        android:layout_below="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/thumbnail"

        android:textSize="@dimen/desc"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Vezi inregistrari"
        android:layout_toRightOf="@+id/thumbnail"
        android:layout_below="@+id/desc"
        android:visibility="invisible"/>
    <TextView
        android:id="@+id/link"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/thumbnail"
        android:layout_toRightOf="@+id/thumbnail"
        android:textSize="@dimen/title"
        android:textStyle="bold"
        android:visibility="gone"/>

    <TextView
        android:id="@+id/cand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/thumbnail"
        android:layout_toRightOf="@+id/thumbnail"
        android:textSize="@dimen/desc"
        android:textColor="@color/verde"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        />


</RelativeLayout>

现在,对于每个 json 元素,我都有一个名为“Recordings”的条目,其值为 Yes 或 No。如果值为 Yes,则必须为特定行设置可见的按钮。

  for (int i = 0; i < response.length(); i++) {
      try {
          JSONObject obj = response.getJSONObject(i);
          Emi movie = new Emi();

          if (obj.getString("Recordings").equals("Yes")) {
              Button b = (Button) getView().findViewById(R.id.button1);
              b.setVisibility(View.VISIBLE);
          }
      movie.setTitle(obj.getString("Titlu"));
      movie.setDesc(obj.getString("Descriere"));
      movie.setCand(obj.getString("Detalii"));
      movie.setThumbnailUrl(obj.getString("PozaModerator"));
      movie.setLink(obj.getString("iurl"));
      // adding movie to movies array
      movieList.add(movie);
      .
      .
      .

但应用程序总是因此错误而崩溃:

08-25 11:44:48.615  10248-10248/com.testapp.aacplay E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.testapp.aacplay.Emisiuni$2.onResponse(Emisiuni.java:105)
            at com.testapp.aacplay.Emisiuni$2.onResponse(Emisiuni.java:88)
            at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
            at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5227)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
            at dalvik.system.NativeStart.main(Native Method)

这是适配器的代码:

public class EmisiuniAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<Emi> movieItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public EmisiuniAdapter(Activity activity, List<Emi> movieItems) {
        this.activity = activity;
        this.movieItems = movieItems;
    }


    public int getCount() {
        return movieItems.size();
    }


    public Object getItem(int location) {
        return movieItems.get(location);
    }

    public long getItemId(int position) {
        return position;
    }


    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.list_emisiuni, null);

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.thumbnail);
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView link = (TextView) convertView.findViewById(R.id.link);
        TextView desc = (TextView) convertView.findViewById(R.id.desc);
        TextView cand = (TextView) convertView.findViewById(R.id.cand);



        // getting movie data for the row
        Emi m = movieItems.get(position);

        // thumbnail image
        thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);

        // title
        title.setText(m.getTitle());

        link.setText(m.getLink());
        desc.setText(m.getDesc());
        cand.setText(m.getCand());
        return convertView;
    }

}

【问题讨论】:

  • 你能发布你用于列表视图的适配器吗?
  • 我已经用适配器代码更新了帖子
  • Emisiuni.java 类的第 105 行的 OnResponse 中存在 NullPointerException 请拉空检查或调试它或发布 Emisiuni.java
  • @gogu 按钮在哪里?在list_emisiun.xml?
  • 是的,它在 list_emisiuni.xml

标签: java android


【解决方案1】:

在埃米

String recording;
public String getRecording() {
    return recording;
}

public void setRecording(String recording) {
    this.recording = recording;
}

在for循环中

   if (obj.getString("Recordings").equals("Yes")) {
         movie.setRecording("Yes");
   }else{
         movie.setRecording("No");
   }

删除这个

  Button b = (Button) getView().findViewById(R.id.button1);
  b.setVisibility(View.VISIBLE);

然后在适配器getView中

  Button b = (Button) convertView.findViewById(R.id.button1);
  if(m.getRecording().equals("Yes"))
  b.setVisibility(View.VISIBLE);
  else
  b.setVisibility(View.INVISIBLE);

你也应该使用 ViewHolder 模式

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

【讨论】:

    【解决方案2】:

    我想在适配器的 xaml 中你也有一个按钮,我建议你在 EmisiuniAdapter.java 中初始化它

    Button button = (Button) findViewById(R.Id.buttonName);
    

    您可以在此处设置可见性属性:

    // I can only image the code, replace it with the correct name/method
    if(!m.getRecordings){
        //this getRecordings is the method that must give you the yes/no from object
        button.setVisibility(View.GONE);
    }
    

    这应该有效,您可以删除您创建的方法以从页面中删除可见性;)

    【讨论】:

      【解决方案3】:

      您需要做的是在适配器本身而不是循环中隐藏/显示您的按钮。

      在你的 bean 类中保存你从 JSON 得到的值

      movide.setRecordings(obj.getString("Recordings"));
      

      然后在适配器中输入你的逻辑,

      if (m.getString("Recordings").equals("Yes")) {
          Button b = (Button) getView().findViewById(R.id.button1);
          b.setVisibility(View.VISIBLE);
      }
      

      您可以相应地修改您的逻辑。

      【讨论】:

        【解决方案4】:

        试试这个;

        button.setVisibility(View.GONE);//when you want to hide
        
        button.setVisibility(View.VISIBILITY);//when you want to show
        

        【讨论】:

          【解决方案5】:

          Step1) 将 button1 的默认可见性设为不可见。

          Step2) 向“Emi”类添加一个“Boolean mbutVisibility”字段。

          Step3)在你的 for 循环中实现(响应一个。你上面提到的)并将该数据保存到 arraylist

          Step4) 将数据传递给适配器并检查布尔值是否为真,然后使其可见,否则它已经不可见。

          我自己做了这个。一切都很好

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-28
            • 2021-04-26
            • 1970-01-01
            • 2017-12-17
            • 2022-11-01
            • 1970-01-01
            • 2014-08-10
            • 1970-01-01
            相关资源
            最近更新 更多