【问题标题】:Listview displays the title and adress of the last items, in all items of the listListview 显示列表所有项中最后一项的标题和地址
【发布时间】:2017-06-17 14:18:16
【问题描述】:

我是安卓新手。我创建了一个导航抽屉并在其中制作了菜单,通过添加片段进行动态化。现在对于每个菜单,我想使用 arrayadapter 类创建一个自定义列表视图。我实现了它,但问题是列表中的每个项目的标题和地址都是相同的。该列表仅显示最后一项。谁能帮帮我!!我想不出解决办法。这是一些代码和一张照片:

import static com.example.user.appsightseeing.R.layout;



public class ParksFragment extends Fragment {
    private ArrayList<Park> parks = new ArrayList<>();


    public ParksFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(layout.fragment_parks, container, false);

        parks.add(new Park("Artificial Lake of Tirana", "The Grand Park of Tirana, also known as the Tirana Park on the Artificial Lake or even the Park of Saint Procopius, is a 230 hectare public park situated on the southern part of Tirana.",
                "At the end of Rruga Sami Frasheri.", R.drawable.artificiallake));
        parks.add(new Park("Zoo park", "The only one of its kind in Albania, Tirana Zoo is concentrated in an area of \u200B\u200B7 hectares in the southern part of town, between the Grand Park and the Botanic Garden of Tirana . The zoo was established in 1966.",
                "Near Rruga Liqeni i Thate", R.drawable.zoopark));
        parks.add(new Park("Memorial park of the Cemetery of the Nation's Martyrs", "The National Martyrs Cemetery of Albania is the largest cemetery in Albania, located on a hill overlooking Tirana. The \"Mother Albania\" statue is located at the Cemetery.",
                "Near street Rruga Ligor Lubonja", R.drawable.memorialpark));
        parks.add(new Park("Kashar park", "The main core of Kashar’s Park, is the Reservoir of Purez- Kus. The reservoir and its surrounding territory are considered as one of the most picturesque and biologically unsoiled suburbs of Tirana.",
                "Kashar", R.drawable.kasharpark));
        parks.add(new Park("Vaqarr park", "The second park in Vaqarr, is a recreational area of 97 ha, that is more than useful to inhabitants in Tirana.",
                "Vaqarr", R.drawable.vaqarripark));
        parks.add(new Park("Farka Lake park", "To the East of the East of Tirana’s city center, Lake Farka is a local favorite for waterborne fun in Summer. Picnicking, jet and water skiing, swimming, boating, all the usual wet sports suspects.",
                "At Lake of Farka, near Rruga Pjeter Budi", R.drawable.farkapark));
        parks.add(new Park("Peza park", "Peza, a village approximately 20 minutes from the center of Tirana, is a popular place for locals to go for a coffee or lunch on the weekends to escape the city.",
                "Peze", R.drawable.pezapark));
        parks.add(new Park("Dajti Recreative park", "This park is one of the components of Dajti National Park, located 26 km east of Tirana and 50 km from \"Mother Teresa\" airport. This place is very frequented by tourists and is also known as the \"Natural Balcon of Tirana\" which offers recreation and accommodation facilities for tourists.",
                "Dajti mountain", R.drawable.dajtirecreative));
        parks.add(new Park("Dajti National park", "Dajti National Park is very important on local, national and regional level, for its biodiversity, landscape, recreational and cultural values. Among others it is considered as a live museum of the natural vertical structure of vegetation.",
                "Dajti mountain", R.drawable.dajtinational));
        parks.add(new Park("Botanic garden", "The Botanical Gardens of Tirana are scenic botanical gardens located in southern Tirana, Albania. It is the only botanical garden in Albania. Construction commenced in 1964, with the original site covering approximately 15 hectares.",
                "Near Zoo park", R.drawable.botanicpark));
        parks.add(new Park("Rinia park", "The park, 500 metres (1,600 ft) from the central square, was built in 1950[5] as part of a major urban development program which developed after World War II. It was initially a pleasant family park where inhabitants of Tirana could take their children.",
                "Near Bulevardi Deshmoret e Kombit and near Rruga Myslym Shyri", R.drawable.riniapark));

        ArrayAdapter<Park> adapter = new parkArrayAdapter(getActivity(), 0, parks);


        ListView listView = (ListView) rootView.findViewById(R.id.customListView);
        listView.setAdapter(adapter);
        return rootView;

        //add event listener so we can handle clicks
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
    }
}

arrayadapter 类:

import java.util.List;



    public class parkArrayAdapter extends ArrayAdapter<Park> {

        private Context context;
        private List<Park> parks;
        private AnimatedStateListDrawable inflater;

        //constructor, call on creation
        public parkArrayAdapter(Context context, int resource, ArrayList<Park> objects) {
            super(context, resource, objects);

            this.context = context;
            this.parks = objects;
        }

        //called when rendering the list
        @NonNull
        public View getView(int position, View convertView, ViewGroup parent) {


            //get the park we are displaying
            Park par = parks.get(position);
            //get the inflater and inflate the XML layout for each item
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.park_layout, null);

            TextView title = (TextView) view.findViewById(R.id.p_title);
            TextView description = (TextView) view.findViewById(R.id.p_description);
            TextView streetname = (TextView) view.findViewById(R.id.address);
            ImageView image = (ImageView) view.findViewById(R.id.image);

            //set title and description
            String titleT = par.getPark_title();
            title.setText(titleT);

            //display trimmed excerpt for description
            int descriptionLength = par.getPark_description().length();
            if(descriptionLength >= 100){
                String descriptionTrim = par.getPark_description().substring(0, 100) + "...";
                description.setText(descriptionTrim);
            }else{
                description.setText(par.getPark_description());
            }

            streetname.setText(par.getPark_streetname());

            //get the image associated with this park
            int imageID = context.getResources().getIdentifier(String.valueOf(par.getPark_image()), "drawable", context.getPackageName());
            image.setImageResource(imageID);

            return view;
        }
    }

公园课:

public class Park {

    private static String title;
    private String description;
    private static String streetname;
    private int image;


    public Park(String title, String description, String streetname, int image){
        this.title = title;
        this.description = description;
        this.streetname = streetname;
        this.image = image;

    }

    public static String getPark_title() { return title; }

    public String getPark_description() {
        return description;
    }

    public static String getPark_streetname() {
        return streetname;
    }

    public int getPark_image() {
        return image;
    }
}

一排公园布局:

<?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"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginRight="10dp"
        android:contentDescription="Park Image" />

    <LinearLayout
        android:id="@+id/infoSection"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/image"
        android:orientation="vertical">

        <TextView
            android:id="@+id/p_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="Park Title"
            android:textColor="@android:color/black"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/p_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="5dp"
            android:text="Park Description"
            android:textColor="@android:color/black"
            android:textSize="15sp" />

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/addressSection"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/infoSection"
        android:orientation="vertical"
        android:layout_alignParentBottom="true">

        <TextView
            android:id="@+id/address"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="2dp"
            android:text="Address:"
            android:textColor="@android:color/black" />

    </RelativeLayout>

</RelativeLayout>

screenshot of the listview with same titles and addresses in all items

【问题讨论】:

    标签: android listview android-fragments android-arrayadapter


    【解决方案1】:

    这与安卓无关。如果你检查你的类,你会看到你描述了 title 和 streetname 字段以及它们的静态 getter 方法。您正面临这个问题,因为当您从适配器获取值时,所有标题和街道名称字段都是相同的。你做了一个很好的例子来描述任何平台上任何应用程序中静态成员和实例成员之间的差异。实例成员位于不同的内存地址,但静态成员位于相同的地址,当您为静态成员分配值时,所有静态成员的值都会发生变化,因为它们位于内存的同一位置。当您删除“静态”字词时,您的列表视图会正常工作。

    【讨论】:

    • 非常感谢您的详细解释!现在我意识到了我没有注意的区别。
    • 欢迎您。很高兴阅读您的评论。最好的教训伴随着好的错误而来,你永远不会忘记静态和实例成员的问题。
    • 你能否给我一个提示,关于如何为我的列表项实现 onItemClickedListener,并使用项目的详细信息开始一个新的活动或一个新的片段(我不确定)。在片段中实现列表视图让我感到困惑,因为它与活动的实现方式不同。我不知道你能不能帮忙..提前谢谢!!!
    • 你能检查我的评论吗? @CanDroid
    • 你好辛迪。您可以查看此链接:stackoverflow.com/questions/6510550/…
    【解决方案2】:

    因为您使用的是静态变量从公园类中的标题和街道名称中删除静态

     private String title; 
     private String streetname;
    

    Java 中的 static 关键字意味着变量或函数在该类的所有实例之间共享,因为它属于该类型,而不是实际对象本身。

    【讨论】:

    • 非常非常感谢您的即时帮助!让我开心!
    【解决方案3】:

    Park 类中的 titlestreetname 字段中删除 static

    此外,类应该大写,所以 ParkArrayAdapter,而不是 parkArrayAdapter

    【讨论】:

    • 非常感谢!实际上我在开始时已经声明它们是静态的,但是由于一些 java 建议,我将它们更改为静态。然后很困惑,看不出有什么区别。现在我意识到为什么我的描述和图像工作正常。这一切都完美无缺!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多