ListView с перекрытием нескольких элементов (представление изображения) - PullRequest
1 голос
/ 13 февраля 2012

Попал в замешательство, я должен сделать книжную полку для планшета.Который держит книги в ряд.Поэтому я планировал использовать вид списка.Я не хочу делать это в виде сетки, потому что фоновое изображение не стало прокручиваться вместе с элементом.Так что у меня не хватило времени.Поэтому подумал, чтобы использовать вид списка.Я могу показывать книги на полке.Но изображения книги на полке пересекаются.Пожалуйста, помогите мне решить эту проблему.Любая помощь очень важна для меня.

Код немного длинен, как и другие списки.Так что я думаю, это происходит из метода getview.Таким образом, вы можете проверить эту часть напрямую.Остальная часть кода для справки. Также обратите внимание на прилагаемый снимок.

Пожалуйста, проверьте следующий код:

/*
 * Number of books in array - totalBooks
 * To display number of books in one row - bookItem
 * Quotient (Number of rows will hold books) -  numberOfBookRows
 * Reminder (Number of extra books in row) - extraBooks  
 */

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.ListView;

public class BookShelf extends Activity {

    private static final String TAG = "Book-shelf";
    //calculation
    private int totalBooks = 0;
    private int bookItem = 0;
    private int numberOfBookRows = 0;
    private int extraBooks = 0;

    private ArrayAdapter<String> adapter;
    private ListView listview;

    private String[] bookName = new String[5];
    private int[] bookImage = new int[5];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.book_shelf);

        // THIS ARE STATIC CONTENT

        // Title of book
        bookName[0] = "EMF";
        bookName[1] = "Ganddhi";
        bookName[2] = "The Code";
        bookName[3] = "The Code";
        bookName[4] = "The Code";

        // Image for book
        bookImage[0] = R.drawable.book1;
        bookImage[1] = R.drawable.book2;
        bookImage[2] = R.drawable.book3;
        bookImage[3] = R.drawable.book3;
        bookImage[4] = R.drawable.book1;

        listview = (ListView) findViewById(R.id.list);
        calculateRowsAndColms();
        adapter = new MyCustomAdapter(BookShelf.this, R.layout.book_shelf_row);
        listview.setAdapter(adapter);
        addEmptyRow(5);
    }

    public void calculateRowsAndColms(){
        totalBooks = 0;
        bookItem = 0;
        numberOfBookRows = 0;
        extraBooks = 0;

        totalBooks = bookName.length;
        bookItem = 3;//TODO: make it dynamic
        if(totalBooks < bookItem && totalBooks > 0){
            numberOfBookRows = 1;
        }else{
            numberOfBookRows = (totalBooks/bookItem);
            extraBooks = (totalBooks % bookItem);
            if( extraBooks != 0)
                 numberOfBookRows++;
        }

        Log.d(TAG," Total books:"+totalBooks);
        Log.d(TAG," Number of books to be displayed:"+bookItem);
        Log.d(TAG," Number of rows occupying the books:"+numberOfBookRows);
        Log.d(TAG," Number of extra books(odd count):"+extraBooks);
    }

    public void addEmptyRow(int count) {

        LinearLayout ll_addRows = (LinearLayout) findViewById(R.id.add_rows);
        LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT);
        count = count * 2;
        for (int i = 0; i < count; i++) {

            ImageView bg = new ImageView(this);
            bg.setImageResource(R.drawable.book_shelf_bgdub);
            bg.setLayoutParams(params);
            bg.setScaleType(ScaleType.FIT_XY);

            ImageView border = new ImageView(this);
            border.setImageResource(R.drawable.book_shelf_border_dub);
            border.setLayoutParams(params);
            border.setScaleType(ScaleType.FIT_XY);

            Log.d(TAG, "i:" + i);
            if (i % 2 == 0)
                ll_addRows.addView(bg, i);
            else
                ll_addRows.addView(border, i);
            Log.d(TAG, "i:" + i);
        }
    }

    public class MyCustomAdapter extends ArrayAdapter {

        Context context;
        int rowXmlId;

        public MyCustomAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
            rowXmlId = textViewResourceId;
            this.context = context;

        }

        @Override
        public int getCount() {
            return numberOfBookRows;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.d(TAG, " POSITION:" + position);

            ViewHolder holder;
            View v = convertView;
            if (convertView == null) {
                holder = new ViewHolder();
                LayoutInflater mInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = mInflater.inflate(rowXmlId, null, false);

                ImageView image1 = (ImageView) v.findViewById(R.id.image1);
                ImageView image2 = (ImageView) v.findViewById(R.id.image2);
                ImageView image3 = (ImageView) v.findViewById(R.id.image3);

                holder.imgList.add(image1);
                holder.imgList.add(image2);
                holder.imgList.add(image3);
                v.setTag(holder);

            } else {
                holder = (ViewHolder) v.getTag();
            }


            if( (position == numberOfBookRows-1) &&  extraBooks!=0)
                for(int i=0; i<extraBooks; i++){ 
                    int k = (position * bookItem)+i;
                    holder.imgList.get(i).setBackgroundResource(bookImage[k]);
                    holder.imgList.get(i).setOnClickListener(new OnBookClickListner());
                    holder.imgList.get(i).setVisibility(View.VISIBLE);
                    holder.imgList.get(i).setId(k);

                    Log.d(TAG,"============> k:"+k+" i:"+i+" id:"+holder.imgList.get(i).getId());
                }
            else
                for(int i=0; i<bookItem; i++){
                    int k = (position * bookItem)+i;
                    holder.imgList.get(i).setBackgroundResource(bookImage[k]);
                    holder.imgList.get(i).setOnClickListener(new OnBookClickListner());
                    holder.imgList.get(i).setVisibility(View.VISIBLE);
                    holder.imgList.get(i).setId(k);

                    Log.d(TAG,"============> k:"+k+" i:"+i+" id:"+holder.imgList.get(i).getId());
                }

            return v;
        }
    }

    static class ViewHolder {
        ArrayList<ImageView> imgList = new ArrayList<ImageView>();
        //ImageView image1, image2 ,image3;
    }

    public class OnBookClickListner implements OnClickListener{

        @Override
        public void onClick(View v) {
            Log.d(TAG, " ITEM SELECTED IN LIST VIEW:"+v.getId());
            Intent intent = new Intent(BookShelf.this, MyLessons.class);
            startActivity(intent);
        }

    }
}

XML прикреплен следующим образом: book_shelf.xml Этоэто основной xml, в котором есть список и добавление рамки для книжной полки при указании и начале списка.Ничего особенного здесь не делается.Просто используя список из этого 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" >

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/book_shelf_top_border" />

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@drawable/book_shelf_border_dub" >
</ListView>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/book_shelf_border_dub" />

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

Нижеприведенный xml book_shelf_row.xml Этот 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:background="@drawable/book_shelf_bgdub"
android:orientation="horizontal" >

<View
    android:layout_width="50dp"
    android:layout_height="120dp" />

<ImageView
    android:id="@+id/image1"
    android:layout_width="100dp"
    android:layout_height="120dp"
    android:layout_gravity="bottom"
    android:src="@drawable/book1"
    android:visibility="invisible" />

<View
    android:layout_width="100dp"
    android:layout_height="120dp" />

<ImageView
    android:id="@+id/image2"
    android:layout_width="100dp"
    android:layout_height="120dp"
    android:layout_gravity="bottom"
    android:src="@drawable/book2"
    android:visibility="invisible" />

<View
    android:layout_width="100dp"
    android:layout_height="120dp" />

<ImageView
    android:id="@+id/image3"
    android:layout_width="100dp"
    android:layout_height="120dp"
    android:layout_gravity="bottom"
    android:src="@drawable/book3"
    android:visibility="invisible" />

</LinearLayout>

В каждом представлении изображения будет храниться изображение книги.

Ниже приведен снимок.Как образы книг перекрываются.the image is over lapping on each other

От R.drawable.book1 до book3 можно увидеть на рисунке соответственно.В первом ряду заменяются сами изображения, а также во втором ряду.Если вы наблюдаете изображение глубоко.Первое изображение в первом ряду.Перекрывается дважды.Я не понимаю, почему это происходит.Можете ли вы помочь мне в этом, пожалуйста.Любая помощь приветствуется.Спасибо.

1 Ответ

2 голосов
/ 18 февраля 2012

Хорошо, проблема решена.В book_shelf_row.xml изображение имеет фоновое изображение.Таким образом, изображения динамически перекрывались.

Вывод: удалите атрибут src из imageview.Так как мы динамически меняем атрибут src в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...