Установить обои по нажатию кнопки в RecyclerView - PullRequest
0 голосов
/ 29 января 2019

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

Это мой activity_main.xml код

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycleView"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">


</android.support.v7.widget.RecyclerView>

Этоmy MainActivity.java file

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    int images[] = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5,
                    R.drawable.pic6, R.drawable.pic7, R.drawable.pic8, R.drawable.pic9, R.drawable.pic10};

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

        recyclerView = findViewById(R.id.recycleView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new ListAdapter(images));

    }
}

Это мой ListAdapter класс, который расширяет RecyclerView.Adapter, также этот класс имеет вложенный класс ListViewHolder , которыйextends RecyclerView.ViewHolder

public class ListAdapter extends
RecyclerView.Adapter<ListAdapter.ListViewHolder> {

    private int[] images;
    public ListAdapter(int[] images){
        this.images = images;
    }

    @NonNull
    @Override
    public ListViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View view = inflater.inflate(R.layout.list_item, viewGroup, false);
        return new ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ListViewHolder listViewHolder, int i) {
        int index = images[i];
        listViewHolder.imageView.setImageResource(index);
    }

    @Override
    public int getItemCount() {
        return images.length;
    }

    public class ListViewHolder extends RecyclerView.ViewHolder{

        ImageView imageView;
        Button setWallpaper;

        public ListViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.my_images);
            setWallpaper = itemView.findViewById(R.id.setWallpaper);
        }
    }
}

Это мой list_item.xml file

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/my_images"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/pic1"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"/>

    <Button
        android:id="@+id/setWallpaper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Set"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="20dp"
        android:layout_marginBottom="20dp"/>

</RelativeLayout>

Это дизайн каждого элемента списка.

enter image description here

Теперь я хочу установить щелчок на кнопке, чтобы установить соответствующие обои на домашний экран.У меня возникли проблемы, где поставить метод onClick () и как установить обои.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

загрузить изображение с Glide или Пикассо внутри onBindViewHolder, с Glide

Glide.with(this).load("image_url").into(imageView);

, затем установить OnClickListener внутри onBindViewHolder как пример

holder.setWallpaper.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

внутри onClick конвертировать изображение врастровые и установить обои.вы можете использовать Glide для этого

Bitmap bitmapImage;
Glide.with(this)
                .asBitmap()
                .load("image_url")
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        bitmapImage = resource;
                    }
                });

, затем выполнить SetWallpaperTask

new SetWallpaperTask().execute();

SetWallpaperTask () класс, подобный этому

private class SetWallpaperTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Long doInBackground(Void... voids) {
            try {
                WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
                wallpaperManager.setBitmap(bitmapImage);

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Long aLong) {
            super.onPostExecute(aLong);
        }
    }
0 голосов
/ 29 января 2019

Внутри bindviewholder сделайте что-то вроде этого:

holder.setwallpaper.setOnClickListener(v -> {
        try {
       WallpaperManager wallpaperManager = WallpaperManager.getInstance(mcontext); 
       Drawable drawable = imageview.getDrawable(position);
//or if the above line of code doesn't work try fetching the image from your array list
imagelist.get(position).image
                Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                wallpaperManager.setBitmap(bitmap);
        } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }


            });

Я дал вам логику, попробуйте, если у вас возникнут проблемы, свяжитесь со мной.

Чтобы передать контекст, сделайте что-то вроде этого: Внутри вашего класса основной деятельности:

public void initializeAdapter()
    {
        absadapter localabsadapter = new absadapter(exlist,abs.this);
        recyclerView.setAdapter(localabsadapter);
    }

Внутри вашего рециркулятора:

Context mContext;
absadapter(List exList,Context context) {
        this.exList= exList;
        this.mContext = context;
}

Счастливое кодирование!

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