Android — ListView не отображается в новой активности

#android #android-activity #android-listview

#Android #android-активность #android-listview

Вопрос:

Я довольно новичок в Android и объектно-ориентированном коде, поэтому, вероятно, я упускаю из виду что-то маленькое.

У меня есть Activity файл, содержащий некоторые пользовательские ListView s, которые находятся в Fragment s, измененные с помощью салфеток и вкладок. При нажатии определенного элемента в определенном списке несколько раз Activity должен открыться новый и содержать другой ListView .

Когда я запускаю свой код, я могу открыть второе действие ( FactoryScreen.java ) из моего Fragment ( StatusFragment.java ), однако FactoryScreen.java оно отображается как пустое Activity .

Я просматривал форумы в Интернете в поисках похожих случаев, но мне не повезло. Опять же, поскольку я новичок в этом, я не совсем уверен в способах отладки этого. Однако я заметил, что fragment_factory_screen.xml , который содержит макет активности, полностью подходит для отображения TextView элемента (с базовым «Hello world»), но, по-видимому, не a ListView .

StatusFragment.java (Заводской экран.java инициализируется отсюда через намерение)

     import java.util.ArrayList;

    import com.example.path.R;

    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.Toast;

    public class StatusFragment extends Fragment
    {
         private Context mContext;
         private ArrayList<DataItem> data = new ArrayList<DataItem>(); // DataItem contains two strings
         ListView myList;
         int i = 0;

         @Override
         public void onCreate (Bundle savedInstanceState)
         {    
              super.onCreate(savedInstanceState);

              mContext = getActivity(); // Get the context of the Activity and therefore the fragment
              myList = new ListView (mContext); // Create a ListView

              // Fill out elements to go into 'data'
              ...
              // data.add each DataItem variable
              ...
          }

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
          {
               // Inflate the view
               View rootView = inflater.inflate(R.layout.fragment_status, container, false);

               // (?) Identify myList to be a list to be placed in rootView
               myList=(ListView) rootView.findViewById(android.R.id.list);
               // Create and set the customised adapter to take data (ArrayList<DataItem>) and format
               // each element placed as defined in list_row.xml
               CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
               myList.setAdapter(adapter);

               // When a myList item is clicked, show a Toast.
               myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
               {
                    public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
                    {
                         // If Item 1 is clicked 3 times, open new Activity
                     if(id == 1)
                     {
                          i  ;
                          if(i == 3)
                          {
                               Intent intent = new Intent(mContext, FactoryScreen.class);
                           i = 0;
                           startActivity(intent);    
                          }
                          else
                          {
                                   ...
                          }
                     }
                     else
                     {
                          ...
                     }
                     }
                 });
             return rootView; // onCreateView must return a View variable if displaying a UI.
         }
     }
 

FactoryScreen.java (действие должно быть открыто, ListView не отображается)

 import java.util.ArrayList;

import com.example.baseappwithcalibration.R;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class FactoryScreen extends Activity {

    private Context mContext;
    private ArrayList<DataItem> data = new ArrayList<DataItem>();
    ListView myList;

    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_factory_screen);

        mContext = this; // Get the context of the Activity and therefore the fragment
        myList = new ListView (mContext); // Create a ListView

        // Create elements to be added to the list
        ...

        // Add elements to the list
        ...
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the view
        View rootView = inflater.inflate(R.layout.fragment_factory_screen, container, false);

        // (?) Identify myList to be a list to be placed in rootView
        myList=(ListView)findViewById(android.R.id.list);
        // Create and set the customised adapter to take data (ArrayList<DataItem>) and format
        // each element as defined in list_row.xml
        CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
        myList.setAdapter(adapter);

        // When a myList item is clicked, show a Toast.
        myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
            {
                // This is used in the form of Toast.makeText(Context, Text, Duration);
                Toast.makeText(FactoryScreen.this, "This is the description of the parameter.", Toast.LENGTH_SHORT).show();
            }
        });
        return rootView; // onCreateView must return a View variable if displaying a UI.
    }
}
 

fragment_factory_screen.xml (Содержит макет для FactoryScreen.xml )

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical" >

    <ListView 
        android:drawSelectorOnTop="false"
        android:id="@android:id/list"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:layout_width="match_parent" >
    </ListView> 

</LinearLayout>
 

Любая помощь / руководство приветствуется!

Ответ №1:

Для действия не вызывается метод onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) .Таким образом, функция is не будет выполнена в вашем случае.Вот почему ListView он не отображается. Итак, в действии FactoryScreen переместите код из этого метода onCreateView() в onCreate() .

 @Override
public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_factory_screen);

    mContext = this; // Get the context of the Activity and therefore the fragment

    // (?) Identify myList to be a list to be placed in rootView
    myList=(ListView)findViewById(android.R.id.list);

    // Create and set the customised adapter to take data (ArrayList<DataItem>) and format
    // each element as defined in list_row.xml
    CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
    myList.setAdapter(adapter);

    // When a myList item is clicked, show a Toast.
    myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
        {
            // This is used in the form of Toast.makeText(Context, Text, Duration);
            Toast.makeText(FactoryScreen.this, "This is the description of the parameter.", Toast.LENGTH_SHORT).show();
        }
    });

}
 

}

Комментарии:

1. Это работает — спасибо! Я пробовал что-то подобное ранее, но у меня были проблемы с областью просмотра. Как ни странно, они больше не появлялись.

Ответ №2:

На вашем заводском экране, в вашем onCreate методе

 myList = new ListView (mContext); // Create a ListView
 

Вы не добавляете ListView в свой макет.

Если макет R.макет.fragment_factory_screen содержит ListView, вы можете получить его с помощью

 myList=(ListView)findViewById(myId);
 

в противном случае вам придется добавить в свое представление код.

Комментарии:

1. Спасибо за помощь. Теперь я решил эту проблему, я пробовал что-то подобное раньше, но безуспешно. Я подумал, что этот подход, возможно, не сработал в первый раз, потому что я пытался создать список до того, как добавил в него элементы.

Ответ №3:

попробуй это

в onCreateView()

 myList=(ListView)rootView.findViewById(android.R.id.list);